カンマ演算子を使用しているだけです。
この演算子は、オペランドを左から右に評価するだけで、2番目のオペランドの値を返します。次に例を示します。
(0, 1); // 1
('foo', 'bar'); // 'bar'
関数を呼び出すコンテキストでは、オペランドの評価は参照ではなく値を取得するだけです。これによりthis
、呼び出された関数内の値がグローバルオブジェクトを指すようになります(またはundefined
、新しいECMAScript 5厳密モードになります)。 。
例えば:
var foo = 'global.foo';
var obj = {
foo: 'obj.foo',
method: function () {
return this.foo;
}
};
obj.method(); // "obj.foo"
(1, obj.method)(); // "global.foo"
ご覧のとおり、直接呼び出しである最初の呼び出しでは、this
内部の値method
が適切に参照されobj
(returning "obj.foo"
)、2番目の呼び出しでは、コンマ演算子による評価によりthis
、グローバルオブジェクトを指す値が作成されます( "global.foo"
)。
このパターンは最近非常に人気があり、を間接的に呼び出すためにeval
、これはES5 strictモードで、たとえばグローバルオブジェクトへの参照を取得するために役立ちます(ブラウザ以外の環境にいると想像してくださいwindow
。利用可能):
(function () {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
})();
上記のコードでは、内部の無名関数は厳密なモードのコードユニット内で実行され、その結果、this
値は。になりますundefined
。
||
演算子は、2番目のオペランドである呼び出しを受け取ります。eval
これは間接呼び出しであり、グローバルな字句および変数環境でコードを評価します。
しかし、個人的には、この場合、strictモードでは、Function
コンストラクターを使用してグローバルオブジェクトを取得することを好みます。
(function () {
"use strict";
var global = Function('return this')();
})();
コンストラクターで作成された関数はFunction
、Use Strict Directiveで始まる場合にのみ厳密になり、関数宣言や関数式のように現在のコンテキストの厳密さを「継承」しません。