私は同じ質問をし、次のように答えを見つけました:
それは本当にのためです
(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
()
しかし、それを回避する方法は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
以前のようにグローバルオブジェクトにバインドされるようにします。