次のようなものがあります
f.call(...)
f.apply(...)
しかし、これがある
(1, alert)('Zomg what is this????!!!11')
この文脈では「1」はあまり意味をなさないようですが、次のものは問題なく機能します。
(null, alert)('Zomg what is this????!!!11')
(1, null, alert)('Zomg what is this????!!!11')
(undefined, alert)('Zomg what is this????!!!11')
その構文を記述する ECMAScript の特定の部分を教えていただけますか?
ベストアンサー1
あなたはただ使っているカンマ演算子。
この演算子はオペランドを左から右にのみ評価し、2 番目のオペランドの値を返します。次に例を示します。
(0, 1); // 1
('foo', 'bar'); // 'bar'
関数を呼び出すコンテキストでは、オペランドの評価によって参照ではなく単純に値が取得されます。これにより、this
呼び出された関数内の値はグローバル オブジェクトを指します (または、undefined
新しい ECMAScript 5 Strict モードになります)。
例えば:
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
( を返します"obj.foo"
)、2 番目の呼び出しでは、コンマ演算子による評価によってthis
値がグローバル オブジェクトを指すようになります( を生成します"global.foo"
)。
このパターンは最近かなり人気になってきており、間接的に呼びかけeval
これは、ES5 の厳密モードでは、グローバル オブジェクトへの参照を取得するのに役立ちます (ブラウザー以外の環境ではwindow
使用できないことを想像してください)。
(function () {
"use strict";
var global = (function () { return this || (1,eval)("this"); })();
})();
上記のコードでは、内部の匿名関数が厳密モードのコード単位内で実行され、結果として値が になりthis
ますundefined
。
演算子||
は、間接呼び出しである 2 番目のオペランドであるeval
呼び出しを受け取り、グローバルな語彙環境と変数環境でコードを評価します。
しかし個人的には、この場合、厳密モードではFunction
コンストラクターを使用してグローバル オブジェクトを取得することを好みます。
(function () {
"use strict";
var global = Function('return this')();
})();
コンストラクターで作成された関数は、Function
Use Strict ディレクティブで始まる場合にのみ厳密であり、関数宣言や関数式のように現在のコンテキストの厳密さを「継承」しません。