JavaScript中apply()调用上下文this未指向全局对象原因求解
JavaScript中apply的this指向问题解答
你的误解核心在于没有理清被替换后的方法执行时的this绑定规则,具体执行逻辑拆解如下:
代码执行流程
你提供的代码完整如下:
var x = 100; function trace(o, m) { let original = o[m]; o[m] = function(...args) { console.log(new Date(), "Entering:", m); let result = original.apply(this, args); console.log(new Date(), "Exiting:", m); return result; }; } let obj = { x: 10, m: function() { console.log('X is: ', this.x); } } trace(obj, 'm'); obj.m();
分步解释
- 执行
trace(obj, 'm')时,会先将obj上原本的m方法暂存到original变量,再把obj.m重写为一个新的匿名函数。 - 后续调用
obj.m()时,遵循对象方法的默认this绑定规则:方法作为对象的属性被调用时,方法内部的this指向调用该方法的对象,也就是此处的obj。 - 匿名函数内部执行
original.apply(this, args)时,传入的this就是上一步得到的obj,相当于把原m方法的this显式绑定为obj再执行,因此最终打印的this.x是obj的属性值10,而非全局作用域下的100。
补充验证
如果想要让原m方法的this指向全局,可以把重写的匿名函数改为箭头函数,箭头函数没有自己的this,会继承外层作用域(即trace函数作用域)的this,默认绑定全局对象,此时apply传入的this就指向全局,打印结果会变成100。
内容的提问来源于stack exchange,提问作者AlexBor
相关产品推荐
相关产品推荐

