关于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会分两步走:
- 首先触发
func1的getter函数,此时getter内部的this确实是x(和你预期的一致),它返回一个匿名函数。 - 关键就在第二步:你是用
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);
它的执行步骤是:
- 先调用
x.func2(),此时func2内部的this是x,它返回一个匿名函数。 - 然后这个匿名函数是无上下文的独立调用——也就是相当于直接执行
(匿名函数)(x),在非严格模式下,这种调用方式的this会绑定到全局对象(浏览器环境是window,Node.js环境是globalThis),严格模式下则是undefined。所以它的this肯定不等于你传入的x,控制台会打印false。
核心差异总结
两个例子的本质区别不是getter和普通方法的区别,而是返回的匿名函数的调用方式不同:
- 第一个例子中,你通过
x.func1(x)的写法,把返回的函数当成x的方法来调用,所以this绑定到x。 - 第二个例子中,你先获取返回的函数,再独立执行它,没有给它绑定任何上下文,所以
this遵循默认绑定规则指向全局对象(或严格模式下的undefined)。
内容的提问来源于stack exchange,提问作者Kirollos Nasr
相关产品推荐
相关产品推荐

