this 的第二个绑定规则是隐式绑定, 即指向上下文对象.
function foo(){
console.log(a);
console.log(this.a);
}
var obj = {
a:2,
foo:foo,
}
var a = 1;
obj.foo() // 依次输出 1 和 2
连续的两次打印, 依次输出 1 和 2. 可以看出在 foo 函数内 a 并不等于 this.a. 这里的 this 指向了 obj 对象.
但是, 如果这样调用
var bar = obj.foo
obj.foo() // 1,2
bar() // 1,1
看上去, 像是等价的语句, 执行结果却不同. 这是因为在 js 中, 函数并不是属于某个对象的. 即便 obj 有个属性绑定了函数 foo, 但 foo 本身是独立于对象obj之外的. 因此, obj.foo() 能够触发隐式绑定, 但 var bar = obj.foo 并不会, 因为 bar并不会引入obj的任何信息, this 自然也无法绑定 obj.






网友评论