为什么用括号调用方法,例如。 (obj.func)(),还设置`this`?

时间:2014-10-06 01:34:21

标签: javascript scope this

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如何解决错误的理解?

(编辑使我混淆的原因更清楚)

1 个答案:

答案 0 :(得分:2)

是。调用的this context的值取决于函数调用的类型。

在您的情况下,它是方法调用 - 由属性引用调用的函数。是的,parentheses 不评估属性引用。

有关详细信息,另请参阅Nature of JS bound functions and function invocation operatorthis very good answer