27

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);
4

2 に答える 2

62

私は同じ質問をし、次のように答えを見つけました:

それは本当にのためです

(0, foo.fn)();

JavaScriptでは、foo.fn()が呼び出されると、の内部でfnthisがにバインドされることに注意してfooください。使用する場合

var g = foo.fn;
g();

次に、gが上で呼び出されると、thisはグローバルオブジェクトにバインドされます(windowWebブラウザのコンテキストでは)。

それで、あなたはg上記のように定義する必要がありますか?あなたは次のようなことをすることができますか

(foo.fn)();

答えはいいえだ。JavaScriptは、削除できる冗長性があるfoo.fn();場合と同じように扱います。foo.fn()

しかし、それを回避する方法は1つあり、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()他の関数や値と一緒にモジュールにパッケージ化されている場合は、関数が次を使用して呼び出されると

someModule.foo();

次に、thisがにバインドさsomeModuleれ、の動作が変更されましたfoo()。したがってfoo()、元の状態を維持するために、バインディングをカットして、の内部でfoo()this以前のようにグローバルオブジェクトにバインドされるようにします。

于 2017-09-25T03:48:11.413 に答える
5

この構文では、コンマ演算子を使用しています,。すべてのオペランドを評価し、最後のオペランドの値を返します。この場合、0はプレースホルダーとして使用されているだけなので、(0, function() {})を返し(function() {})ます。評価された後、(args)パーツは関数を呼び出し、引数を与えます。

コメント後に編集:

このスタイルのコーディングを使用する理由は、コードをすばやくまたは1行で実行できるようにするためです。次に例を示します。

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
于 2012-07-18T12:25:02.063 に答える