26

のようなものがあります

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の特定の部分を指摘できますか?

4

3 に答える 3

53

カンマ演算子を使用しているだけです。

この演算子は、オペランドを左から右に評価するだけで、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で始まる場合にのみ厳密になり、関数宣言や関数式のように現在のコンテキストの厳密さを「継承」しません。

于 2011-03-01T23:13:30.920 に答える
9

これはコンマ演算子であり、両方のオペランドを評価し、2番目のオペランドの値を返します。

したがって、のようなもの(null, alert)は関数に評価され、alert括弧を使用してすぐに呼び出すことができます。

ECMA-262(PDF)のセクション11.14で説明されています。

于 2011-03-01T23:10:53.033 に答える
3

コンマ演算子を使用すると、式が順番に評価されます。式を括弧で囲むと、最後の式の値が返されます。したがって(1, alert)("hello")、機能的には次のものと同等です。

1;
alert("hello");

頭から離れて、私はこれをする理由を考えることができません。

于 2011-03-01T23:13:11.403 に答える