JavaScript语法(0,fn)(args)

时间:2012-07-18 12:14:54

标签: javascript

只需检查Google的JavaScript代码,我就找到了这种语法:

var myVar = function...;
(0, myVar)(args);

您知道这种语法的含义吗? 我找不到之间的区别 (0, myVar)(args);myVar(args);

举一个确切的例子,我们有

_.x3 = function (a, b) {
    return new _.q3(20 * b.x + a.B.B.x, 20 * b.y + a.B.B.y)
};

以后

this.ta = new _.s3((0, _.x3)(this.fa, this.B.B), 0);

3 个答案:

答案 0 :(得分:10)

我有同样的问题,然后找到答案,如下:

真的是

(0, foo.fn)();

请记住,在JavaScript中,当foo.fn()被调用时,fn内部this被绑定到foo。如果你使用

var g = foo.fn;
g();

然后在上面调用g时,this绑定到全局对象(window,在Web浏览器的上下文中。)

那么你需要像上面那样定义g吗?你能做点什么吗

(foo.fn)();

答案是否定的。 JavaScript会将其视为与foo.fn();相同,因为只有foo.fn可以删除多余的()

但有一种方法可以绕过它,而且正是使用the comma operator, which Mozilla stated as

  

逗号运算符计算每个操作数(从左到右)并返回最后一个操作数的值

所以使用

(0, foo.fn)();

(0, foo.fn)将被评估为对函数的引用,如上面的g,然后调用该函数。然后,this不绑定到foo,而是绑定到全局对象。

所以用这种方式编写的代码就是“削减绑定”​​。

示例:

var foo = { 
              fullName: "Peter", 
              sayName:  function() { console.log("My name is", this.fullName); } 
          };

window.fullName = "Shiny";

foo.sayName();       // My name is Peter

(foo.sayName)();     // My name is Peter

(0, foo.sayName)();  // My name is Shiny

答案 1 :(得分:4)

此语法使用逗号运算符,。它评估所有操作数并返回最后一个操作数的值。在这种情况下,0仅用作占位符,因此(0, function() {})将返回(function() {})。在评估之后,(args)部分正在调用该函数并为其提供参数。

评论后修改:

使用这种编码风格的原因是他们可以快速或一行地执行代码。这是一个例子:

var a = 0,
    b = 1,
    c;

c = ( a++, b++, a + 2 ); // a is added, b is added, and a is added then returned

a; // 1
b; // 2
c; // 3

答案 2 :(得分:0)

逗号运算符返回最后一个操作数的值,因此0, myVar的值与myVar的值相同。评估第一个操作数的值,但在这种情况下,它当然不能完成任何操作。

当第一个操作数实际执行某些操作时,有时会使用逗号运算符,例如在循环中初始化两个变量:

for (i = 0, j = 42; i < 10; i++, j--) ...