Javascript 什么';使用这种语法(0,u.Em)()的原因是什么;
在研究google plusone脚本时,我多次看到以下语法:Javascript 什么';使用这种语法(0,u.Em)()的原因是什么;,javascript,syntax,google-plus-one,Javascript,Syntax,Google Plus One,在研究google plusone脚本时,我多次看到以下语法: (0, _.Em)(); 假设\uem是一个函数,上面的语句将导致调用该函数,这是非常明显的。另一方面,如果它是未定义的,那么其结果不就是简单地执行\uuuu.Em() 有人能解释一下使用这种语法背后的想法吗?基本上,这种语法允许在窗口对象的上下文中调用.Em(),而不是 假设您有此代码: Foo = function() { this.foo = "foo"; }; Foo.prototype.Em = functio
(0, _.Em)();
假设\uem
是一个函数,上面的语句将导致调用该函数,这是非常明显的。另一方面,如果它是未定义的,那么其结果不就是简单地执行\uuuu.Em()
有人能解释一下使用这种语法背后的想法吗?基本上,这种语法允许在
窗口
对象的上下文中调用.Em()
,而不是
假设您有此代码:
Foo = function() {
this.foo = "foo";
};
Foo.prototype.Em = function() {
alert(this.foo);
};
var _ = new Foo();
发出.Em()
将导致在的上下文中调用Em()
。在函数内部,此
关键字将引用
,因此将打印foo
发出(0,u.Em)(
将方法调用与对象解耦,并在全局上下文中执行调用。在函数内部,此
关键字将引用窗口
,因此将打印未定义的
,因为窗口
没有foo
属性
您可以在中测试这两个语法之间的差异,因为计算\uem
然后应用call运算符与直接调用\uem()
不同。独立计算.Em
会返回一个“自由函数”,因为没有更好的术语,该函数将不再绑定到\ucode>对象。同样的结果也可以通过写入var f=uu.Em;f()代码>。在这两种情况下,此
关键字将引用函数中的窗口
,而不是。+1,回答正确。我想补充一点,这可能是我在JS中见过的最无意义的语法加糖形式(0,)()
的长度与.call()
的长度完全相同,因此,除非删除逗号后的空格(即使只有一个空格),否则不会保存字节。以迷惑毫无戒心的开发人员为代价,使用这样的语法似乎真的不值得。@Andy,我认为这与。在这种模式下,没有参数的.Em.call()
将在未定义的上下文中调用Em()
,而不是window
,并且.Em.call(window)
可以说比(0,..Em)(
)长。那么(0,..Em)如何将Em
与隔离呢?我知道(1,2,3)的结果是3。因此,似乎(.Em)
和(0,.Em)应该是等价的,但是(.Em)(
的行为就像。.Em()
一样,所以它们显然是不同的。另外,在Chrome中,fiddle示例报告了未定义
,而不是窗口
@Devon,是的,这不仅仅是Chrome。正如我在回答中所说,未定义的
将被打印,因为this.foo
是被计算的,而不仅仅是this
(它将打印[对象窗口]
)。现在,(0,.Em)
与(.Em)
不同,因为涉及逗号运算符,所以在看到调用运算符之前,u.Em
作为自由函数返回(u.Em)
等同于uu.Em
,因为括号之间的单个表达式始终等同于该表达式。另请参见