“(0, somefunc)(args)”是什么意思?

7

我正在查看一些Gmail的JavaScript代码(编写扩展程序),并且在各个地方都看到了(0, _.ab)(a)或其变体。这是什么意思?

我已经尝试了一些测试,例如:

function a(a,b,c){ console.dir(a+b+c); }
(0, a)(1,2,3)

然而,我无法弄清楚为什么他们不直接调用a(1,2,3)。使用(0,a)调用它是否有一些奇怪的好处? 我制作了一个jsperf(http://jsperf.com/direct-vs-0-func-calls)来测试这个问题,a(1)(0,a)(1)似乎是相同的。 编辑:据我所知,谷歌只在需要直接调用函数时才使用它,例如从gmail的源代码中获得的if ((0, _.wa)(a))

5
我猜这是压缩器或转译器的副产品。 - Pointy
1
那是我的想法,但为什么缩小器会这样做呢? - Joey Ciechanowicz
2
你确定第一个函数不是返回了一个函数吗?它可能是一个链式调用。 - gpgekko
当你有jQuery时,这个也可以工作:(0, $)('body');,它基本上与只调用$('body');相同...咦。 - Cerbrus
@Cerbrus这很令人惊讶,因为$不是一个函数。 - Zirak
显示剩余5条评论
1个回答

11

(0, func)()语法确保被调用的函数func中的上下文(this)为全局上下文。

例如:

var myContext = {
    func: function () { 
        console.log(this);
    }
};

myContext.func();        // => myContext
(0, myContext.func)();   // => window

有意思。这个有文档资料吗? - Cerbrus
哦,消除作用域链以访问全局对象?聪明。 - Ian Brindley
“逗号运算符”。我总是忘记这些也是运算符。 - Cerbrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接