这是第三次研究this的用法了。经过前两次的研究后,我觉得自己已经完全明白了this的机制。结果今天又遇到问题了,匿名函数里的this指向了undefined:
function logId () {
'use strict';
customerIdArray.forEach(function (id) {
console.log(this.db.get(id));
});
}
这里无论怎么看都应该指向window
,很明显是默认绑定,但是指向的是undefined
。我看到一个解释说是“所有者”,因为构造函数和原型上的方法有所有者,所以this指向相应对象的实例,而匿名函数没有所有者,所以指向undefined
。
这个解释很形象,也确实能解释这里的问题;但是所有者这个说法并不很严谨,因为隐式绑定丢失的问题,就是函数被它的“所有者”卖了:
function foo() {
console.log(this.a);
}
var obj = {
a: 2,
foo: foo
}
var bar = obj.foo;
a = 3;
bar(); // 3
事实上,在严格模式下,this如果是默认绑定,会被绑定到undefined
,而不是全局对象(window
或者global
)上。而且,这里的要求是,函数体处于严格模式,至于调用方是不是严格模式倒无所谓。
所以,如果把之前的函数体里的'use strict'
去掉,又会像平常一样,绑定到window
了。这也是严格模式的一个特点,尽可能减小对其他部分的影响。
应该不会有第四次研究了……吧。