【问题标题】:JavaScript syntax (0, fn)(args)JavaScript 语法 (0, fn)(args)
【发布时间】:2012-07-17 11:23:11
【问题描述】:

刚刚检查了 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);

【问题讨论】:

标签: javascript


【解决方案1】:

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

真的是为​​了

(0, foo.fn)();

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

var g = foo.fn;
g();

那么当上面调用g 时,this 绑定到全局对象(window,在网络浏览器的上下文中)。

那么你需要像上面那样定义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

现在为什么有些代码要切断绑定?我在某些情况下读到了,如果我们有一个函数:

function foo() {
  // using `this` here
}

然后this 将指向全局对象。但是如果foo()与其他函数和值一起打包成一个模块,那么在调用函数时使用

someModule.foo();

然后this 绑定到someModule,它改变了foo() 的行为。因此,为了保持foo() 的原样,我们切断了绑定,以便在foo() 内部,this 像以前一样绑定到全局对象。

【讨论】:

  • JavaScript 像往常一样可预测:'D
【解决方案2】:

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

【讨论】:

  • 是的,这绝对是一个很好的理由,但是...... 0 意味着什么。是否有某种保护、描述或赋予 (0, fn)() 含义而不仅仅是 fn() 的东西。
  • 抱歉,我想不出来。我敢肯定,如果 Google 使用它是有原因的。
猜你喜欢
  • 2010-09-23
  • 2021-08-13
  • 2016-12-13
  • 2014-07-29
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多