JavaScript 语法 (0, fn)(args)

IT技术 javascript
2021-02-08 02:13:17

只是检查谷歌的 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);
2个回答

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

真的是为了

(0, foo.fn)();

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

var g = foo.fn;
g();

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

那么你需要g像上面那样定义吗?你能做一些诸如

(foo.fn)();

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

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

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

所以使用

(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()与其他函数和值一起打包成一个module,那么在调用该函数时使用

someModule.foo();

那么this必然someModule,并且它改变了 的行为foo()因此,要保持foo()为原来的,因为它是我们削减的结合,所以这里面foo(),将this势必会像以前一样全局对象。

JavaScript 像往常一样可预测 :'D
2021-04-06 02:13:17

此语法使用逗号运算符,. 它评估其所有操作数并返回最后一个的值。在这种情况下, 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
对不起,但我想不出任何。我相信如果谷歌使用它是有原因的。
2021-03-23 02:13:17
是的,绝对是一个很好的理由,但是... 0 没有任何意义。是否有某种保护、解析或赋予 (0, fn)() 含义的东西,而不仅仅是 fn()。
2021-04-05 02:13:17