只需检查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);
答案 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--) ...