JavaScript对象函数和` this`在解除绑定并在表达式/参数中返回时
第1-2行和第4-5行就返回的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)() // =
而言是有意义的。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)
中断引用或在不添加行的情况下进行间接调用。这也导致:)