JavaScript对象函数和` this`在解除绑定并在表达式/参数中返回时

JavaScript对象函数和` this`在解除绑定并在表达式/参数中返回时,javascript,this,Javascript,This,第1-2行和第4-5行就返回的而言是有意义的。3号线我遗漏了什么?我认为它将返回类似于第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)() // =

第1-2行和第4-5行就返回的
而言是有意义的。3号线我遗漏了什么?我认为它将返回类似于第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

分组运算符不会销毁引发方法调用的属性引用

这在以下章节中明确提到:

注意:此算法不适用于 计算
表达式
。这样做的主要动机是 诸如
delete
typeof
之类的运算符可应用于括号中的 表情


在第4行和第5行中,取消引用属性并生成“unbound”函数的不是括号而是运算符(
?:
|

如果将其拆分为不同的行,可能会更有意义:

foo = {
    bar: function() {
        return this;
    }
}
因此,当您调用
foo.bar
时,您将得到
function(){returnthis;}
。在第二行,您直接调用该函数(
foo.bar()
),因此它返回对象(
foo
)的实例
this

在第三行,您得到了相同的结果,因为您不仅要求匿名函数,还执行该函数:

(foo.bar); // (function() { return this; }); A reference to the function
(foo.bar)(); // (function() { return this; })(); Actually calling the function
因为在后一种情况下,您正在执行第二行中的函数,结果是相同的(
foo


然而,在第四行和第五行中,正如Bergi所说,您使用的运算符将它们从函数中解除引用,这将给您留下一个
窗口
对象,而不是
foo

,据我所知,
(foo.bar)
foo.bar
(第2行)之间没有区别。它只是插入了一些不必要的括号,比如'1+2*3'和'1+(2*3)'是一样的,回答不错,实际上有一些常见的技巧可以“绕过”这个,我见过的最常见的是
(0,foo.bar)
中断引用或在不添加行的情况下进行间接调用。这也导致:)