JavaScript 对象函数和 `this` 未绑定并在 expression/parens 中返回时

JavaScript object functions and `this` when unbound and returned in expression/parens

第 1-2 行和第 4-5 行在 this returned 方面是有意义的。关于第 3 行,我缺少什么?我认为它会 return window 类似于第 4-5 行。在这 5 个中是否还有其他模式可以帮助证明原因?

foo = { bar : function () { return this } }

foo.bar() // ==> foo

(foo.bar)() // ==> foo / but why?

(foo.bar ? foo.bar : $.noop)() // ==> window

(foo.bar || 0)() // ==> window

分组运算符不会破坏 属性 引用,这些引用引发 方法 调用。

这在the spec中明确提到:

NOTE: This algorithm does not apply GetValue to the result of evaluating Expression. The principal motivation for this is so that operators such as delete and typeof may be applied to parenthesised expressions.

在第 4 行和第 5 行中,取消引用 属性 并生成 "unbound" 的不是括号,而是运算符(?:||)功能。

foo.bar这里是匿名函数

如果将它分成不同的行可能更有意义:

foo = {
    bar: function() {
        return this;
    }
}

因此,当您调用 foo.bar 时,您将得到 function() { return this; }。在第二行,你直接调用那个函数(foo.bar()),所以它returns this,对象的实例(foo).

在第三行,你会得到相同的结果,因为你不是 请求匿名函数,而是执行该函数:

(foo.bar); // (function() { return this; }); A reference to the function
(foo.bar)(); // (function() { return this; })(); Actually calling the function

因为在后一种情况下,您正在执行第二行中的函数,结果是相同的 (foo)。

然而,在第四行和第五行中,正如 Bergi 所说,您使用的运算符从函数中取消引用它们,这使您得到一个 Window 对象而不是 foo.