var value = 2
var foo = {
value: 1,
bar: bar.bind(foo)
}
function bar() {
console.log(this.value)
}
foo.bar() //2
var value = 2
var foo = {
value: 1,
bar: bar.bind(foo)
}
function bar() {
console.log(this.value)
}
foo.bar() //2
我们把 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
可以理解为一个不存在的变量,用于存放结果。undefined
。额... 你可以先看看不同情况下this是谁 可以看看 你不知道的Javascript这本书 好像是3本 很薄的 里面有有解释 我觉得写的还可以 然后var 在浏览器使用的时候会声明到window上 这个也有很多博客讲 看明白就理解了
13 回答13k 阅读
8 回答2.8k 阅读
2 回答5.2k 阅读✓ 已解决
7 回答2.2k 阅读
5 回答1.3k 阅读
3 回答2.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
造成这种现象的原因是
bar.bind(foo)
在运行的时候foo还是undefined,所以foo.bar里的this指向了window