什么原因使用这种语法(0,_.Em)();

在调查谷歌plusone脚本时,我曾多次看到以下语法:

(0, _.Em)(); 

假设_.Em是一个函数,上面的语句将导致调用该函数,这是非常明显的。 另一方面,如果它是未定义的,那么结果是否与简单的_.Em()

任何人都可以阐明使用这种语法背后的想法吗?

基本上,这个语法允许在window对象的上下文中调用_.Em()而不是_

假设你有这样的代码:

 Foo = function() { this.foo = "foo"; }; Foo.prototype.Em = function() { alert(this.foo); }; var _ = new Foo(); 

发出_.Em()将导致Em()_的上下文中被调用。 在函数内部, this关键字会引用_ ,所以foo将被打印。

发出(0, _.Em)()将对象的方法调用解耦,并在全局上下文中执行调用。 在函数内部, this关键字将引用window ,所以undefined将被打印,因为window没有foo属性。

你可以testing这个小提琴中两种语法的区别。