JavaScript语法(0,fn)(参数)

JavaScript syntax (0, fn)(args)

只是检查Google的JavaScript代码,我发现了以下语法:

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

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

myVar(args);

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

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

然后

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


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

真的是为了

1
(0, foo.fn)();

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

1
2
var g = foo.fn;
g();

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

那么,您是否需要像上面那样定义g?你能做些诸如

1
(foo.fn)();

答案是不。 JavaScript将其与foo.fn();相同,因为它只是foo.fn,带有可以删除的冗余()

但是有一种解决方法,它就是使用逗号运算符,Mozilla表示为

The comma operator evaluates each of its operands (from left to right) and returns the value of the last operand

所以用

1
(0, foo.fn)();

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

因此,以这种方式编写的代码是"剪切绑定"。

例:

1
2
3
4
5
6
7
8
9
10
11
12
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


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

评论后编辑:

之所以使用这种编码风格,是因为他们可以快速执行代码或一行执行代码。这是一个例子:

1
2
3
4
5
6
7
8
9
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


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

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

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