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

WTK*_*WTK 10 javascript syntax google-plus-one

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

(0, _.Em)();
Run Code Online (Sandbox Code Playgroud)

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

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

Fré*_*idi 8

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

假设你有这个代码:

Foo = function() {
    this.foo = "foo";
};

Foo.prototype.Em = function() {
    alert(this.foo);
};

var _ = new Foo();
Run Code Online (Sandbox Code Playgroud)

发行_.Em()将导致在Em()上下文中被调用_.在函数内部,this关键字将引用_,因此foo将被打印.

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

您可以测试这个小提琴中两种语法之间的区别.

  • 因为评估`_.Em`然后应用调用运算符与直接调用`_.Em()`不同.由于缺少更好的术语,评估`_.Em`独立地返回一个"自由函数",并且该函数将不再与`_`对象相关联.通过编写`var f = _.Em;可以获得相同的结果.F();`.在这两种情况下,`this`关键字将在函数内部引用`window`而不是`_`. (5认同)
  • @Devon,是的,那不仅仅是Chrome.正如我在回答中所说的那样,'undefined`将被打印,因为`this.foo`被评估,而不仅仅是'this`(它会打印`[object Window]`).现在,`(0,_.Em)`与`(_.Em)`不同,因为涉及逗号运算符,所以`_.Em`在看到调用运算符之前作为自由函数返回.`(_.Em)`相当于`_.Em`,因为括号内的单个表达式总是等于该表达式. (3认同)