关于 JS 回调函数中使用 this 出现问题的思考

在《你不知道的 JS》中对 this 有详细的讲解。关于回调函数中 this 使用,我有了这样的理解。

Talk is cheap, show me code.

var fn = function(callback) {
  var value = 1;
  return callback();
}

var value = 0;

var foo = {
  value: 2,
  bar: function() {
    return this.value;
  }
}

console.log(fn(foo.bar));

在非严格模式下,上述代码打印的结果是 0,即回调函数在执行时会导致 this 指向发生变化。

什么原因呢?

在《你不知道的 JS》书中有讲到:

var foo = {
	bar: function () {
		// this
	}
}

var fn = foo.bar

这样赋值操作会导致隐式绑定的 this 指向发生变化。

而回调函数往往作为一个函数的参数被传入,而函数的参数传递是一个赋值过程。所以会导致隐式绑定 this 指向的问题。

由于 this 有四种绑定:直接绑定、隐式绑定、显示绑定、以及 new 绑定,它们的优先级依次递增。而像上面的赋值过程只会影响直接绑定和隐式绑定。

var fn = function(callback) {
  var value = 1;
  return callback.call(foo); // 这里 callback 被显示绑定
}

var value = 0;

var foo = {
  value: 2,
  bar: function() {
    return this.value;
  }
}

console.log(fn(foo.bar)); // 2,能得到我们想要的结果

故对于回调函数来说,在其内部使用 this 是不把稳的做法,解决方案可以在其调用时使用 call / apply / bind 显示绑定。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值