You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:54:07