我很好奇为什么这样做:
var c = {
d: function myFunc() {
console.log(this === window);
}
};
var a = {
b: function() {
console.log(this === a);
(0,c.d)();
c.d();
}
};
a.b();
Run Code Online (Sandbox Code Playgroud)
控制台输出:
True
True
False
Run Code Online (Sandbox Code Playgroud)
所以它似乎(0, c.d)()是相同的c.d.call(window),但我似乎无法找到关于它为什么或如何工作的太多.谁能解释一下?
来自:关闭编译器问题
Eli*_*ing 21
如果你编写用逗号(,)分隔的多个表达式,那么将评估所有表达式,但最终会得到最后一个表达式的值:
var x = (1,2,3);
console.log(x); // this will log "3"
Run Code Online (Sandbox Code Playgroud)
现在(0,c.d)是将返回函数的表达式c.d,但现在c是不是this该功能了.这意味着this将指向全局对象(window),或在严格模式下保持未定义.您将获得与以下任何相同的效果:
var f = function(x) { return x; };
f(c.d)();
Run Code Online (Sandbox Code Playgroud)
要不就
var f = c.d;
f();
Run Code Online (Sandbox Code Playgroud)
Cas*_*Chu 16
表达式(0, myFunc)相当于just myFunc.该逗号操作需要多个表达式,对其进行评估,并返回最后一个表达式,那么(0, myFunc)仅返回myFunc.
现在,在你的b方法中,this等于a因为b附加了a.换句话说,b可以被称为a.b().然而,myFunc在没有连接到a(你不能调用myFunc通过a.myFunc()),所以myFunc,this不能a.实际上,myFunc在没有设置它的情况下调用它this所以默认为全局对象window(或者在严格模式下保持未定义),因此它this等于window.
你可能想知道它是什么意思(0, listeners[i])(),然后,当他们刚刚写完时listeners[i]().考虑这个代码创建一个包含两个元素的数组,这两个函数都是:
var listeners = [
function () { alert(this); },
function () { alert(this); }
];
Run Code Online (Sandbox Code Playgroud)
当你调用时listeners[0](),那么在listeners[0]函数中,this等于listeners,因为0附加到listeners,就像b附加到的一样a.但是,当您调用函数时(0, listeners[0])(),listeners[0]它与listeners数组"解耦" .*由于解耦函数不再附加到任何东西,因此它this是全局对象window.
*就好像你写的:
var temp = listeners[0];
temp();
Run Code Online (Sandbox Code Playgroud)