JavaScript での間接関数呼び出し 質問する

JavaScript での間接関数呼び出し 質問する

次のようなものがあります

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')();
})();

コンストラクターで作成された関数は、FunctionUse Strict ディレクティブで始まる場合にのみ厳密であり、関数宣言や関数式のように現在のコンテキストの厳密さを「継承」しません。

おすすめ記事