第三次谈JavaScript中的this

这是第三次研究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了。这也是严格模式的一个特点,尽可能减小对其他部分的影响。

应该不会有第四次研究了……吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值