为什么调用带括号的方法,例如(obj.func)(),仍然设置“this”

Why does calling a method with parenthesis, eg. (obj.func)(), still set `this`?

本文关键字:调用 设置 this func obj 方法 为什么 例如      更新时间:2023-09-26

JS中导致以下结果的解析规则究竟是什么:

假设我们有这个功能

getThis = function(){
  return this;
}

使用"上一个点"规则:,这些都可以按预期工作

getThis(); //=> Window
obj = {getThis: getThis};
obj.getThis(); //=> obj
getThisTwo = obj.getThis;
getThisTwo(); //=> Window

然而,这让我感到惊讶:

(obj.getThis)() //=> obj ...WAT

我的直觉是,它的行为与第三个例子(getThisTwo)完全一样。即,对括号中的部分进行求值,返回一个匿名函数,然后调用该函数。我的期望是this将是Window,而不是obj

这是一个特殊情况,还是我对this如何解决的理解有问题?

(经过编辑以使我困惑的原因更清楚)

是。调用的this上下文的值取决于函数调用的类型。

在您的案例中,它是一个方法调用——一个由属性引用调用的函数。是的,括号不计算属性引用。

有关详细信息,请参阅JS绑定函数和函数调用运算符的性质以及这个非常好的答案。