JavaScript语法(0,fn)(args)

kor*_*rko 7 javascript

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

var myVar = function...;
(0, myVar)(args);
Run Code Online (Sandbox Code Playgroud)

你知道这个语法的含义吗?我找不到之间的差异 (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)
};
Run Code Online (Sandbox Code Playgroud)

然后

this.ta = new _.s3((0, _.x3)(this.fa, this.B.B), 0);
Run Code Online (Sandbox Code Playgroud)

nop*_*ole 16

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

它真的是为了

(0, foo.fn)();
Run Code Online (Sandbox Code Playgroud)

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

var g = foo.fn;
g();
Run Code Online (Sandbox Code Playgroud)

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

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

(foo.fn)();
Run Code Online (Sandbox Code Playgroud)

答案是不.JavaScript的对待它一样foo.fn();,因为它只是foo.fn有剩余(),可以删除.

但有一种方法可以绕过它,而且正是使用逗号运算符,Mozilla称之为

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

所以使用

(0, foo.fn)();
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

  • JavaScript 像往常一样是可预测的 :'D (5认同)
  • 这是一个说明充分的答案,谢谢您今天帮助我学习一些东西。 (2认同)

0x4*_*2D2 5

此语法使用逗号运算符,. 它评估其所有操作数并返回最后一个的值。在这种情况下, 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
Run Code Online (Sandbox Code Playgroud)