var value = 2
var foo = {
value: 1,
bar: bar.bind(foo)
}
function bar() {
console.log(this.value)
}
foo.bar() //2
###造成这种现象的原因是bar.bind(foo)
在运行的时候foo还是undefined,所以foo.bar里的this指向了window
我们把 foo
换成 undefined
可以看到结果也是 2
。
然后我们开启严格模式,就会发现报错了,那么可以知道这里走的规则是什么了。
接下来说说执行顺序
-
提升
var value; var foo; function bar() { console.log(this) console.log(this.value) }
-
当前的命令,我们重点看
foo
赋值的时候。
考察你一下运算符的优先级,你说foo = 1 + 1
是先算1+1
还是先算foo = 1
?value = 2 foo = { value: 1, bar: bar.bind(foo) } foo.bar()
- 当然是
=
赋值运算符的优先级更低了foo = 1 + 1
可以理解为_foo = 1 + 1; foo = _foo
,这里_foo
可以理解为一个不存在的变量,用于存放结果。
那么就不难理解了,foo未赋值的情况下,你访问了一下他,所以为undefined
。
- 当然是
额... 你可以先看看不同情况下this是谁 可以看看 你不知道的Javascript这本书 好像是3本 很薄的 里面有有解释 我觉得写的还可以 然后var 在浏览器使用的时候会声明到window上 这个也有很多博客讲 看明白就理解了
###bar中的this指向了window,在输出上加一个log,一目了然
谢谢大家的帮助,我想我应该明白了。