什么原因使用这种语法(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这个小提琴中两种语法的区别。