Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';使用这种语法(0,u.Em)()的原因是什么;_Javascript_Syntax_Google Plus One - Fatal编程技术网

Javascript 什么';使用这种语法(0,u.Em)()的原因是什么;

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

在研究google plusone脚本时,我多次看到以下语法:

(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
,因为括号之间的单个表达式始终等同于该表达式。另请参见