用窗口范围说明调用函数(0,function(){})()

Ada*_*ath 20 javascript

我很好奇为什么这样做:

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),但我似乎无法找到关于它为什么或如何工作的太多.谁能解释一下?

来自:关闭编译器问题

小提琴:http://jsfiddle.net/wPWb4/2/

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)