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

关于Getter返回函数中this关键字指向不符合预期的技术咨询

为什么Getter返回的函数中this指向对象,而普通方法返回的函数却不?

这个问题的核心其实是函数调用时的this绑定规则,以及调用返回函数的方式差异,咱们一步步拆解清楚:

第一个例子的执行逻辑

先看你的第一个代码片段:

let x = { z : 10 , get func1() { return function(v) { console.log(this === v); } } }
x.func1(x)

当你执行x.func1(x)时,JavaScript会分两步走:

  1. 首先触发func1的getter函数,此时getter内部的this确实是x(和你预期的一致),它返回一个匿名函数。
  2. 关键就在第二步:你是用x作为调用者来执行这个返回的匿名函数!x.func1(x)的写法等价于:
    const returnedFunc = x.func1; // 获取getter返回的函数
    returnedFunc.call(x); // 以x为上下文调用该函数
    
    所以这个匿名函数的this自然就绑定到了x,和你传入的参数v相等,控制台会打印true。

第二个例子的执行逻辑

再看第二个代码片段:

let x = { func2() { return function(v) { console.log(this === v); } } }
x.func2()(x);

它的执行步骤是:

  1. 先调用x.func2(),此时func2内部的this是x,它返回一个匿名函数。
  2. 然后这个匿名函数是无上下文的独立调用——也就是相当于直接执行(匿名函数)(x),在非严格模式下,这种调用方式的this会绑定到全局对象(浏览器环境是window,Node.js环境是globalThis),严格模式下则是undefined。所以它的this肯定不等于你传入的x,控制台会打印false。

核心差异总结

两个例子的本质区别不是getter和普通方法的区别,而是返回的匿名函数的调用方式不同:

  • 第一个例子中,你通过x.func1(x)的写法,把返回的函数当成x的方法来调用,所以this绑定到x。
  • 第二个例子中,你先获取返回的函数,再独立执行它,没有给它绑定任何上下文,所以this遵循默认绑定规则指向全局对象(或严格模式下的undefined)。

内容的提问来源于stack exchange,提问作者Kirollos Nasr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:27:40