1. ホーム
  2. javascript

[解決済み] (1, eval)('this') vs eval('this') in JavaScript?

2023-01-24 04:09:53

質問

読み始めると JavaScriptのパターン は、いくつかの コード は私を混乱させた。

var global = (function () {
    return this || (1, eval)('this');
}());

以下は私の質問です。

Q1:

(1, eval) === eval ?

なぜ、どのように機能するのでしょうか?

Q2:なぜ

var global = (function () {
    return this || eval('this');
}());

または

 var global = (function () {
    return this;
}());

どのように解決するのですか?

の違いは (1,eval) と平凡な eval は、前者が であり、後者はlvalueであることです。 他の識別子であればもっとわかりやすいのですが。

var x;
x = 1;
(1, x) = 1; //  syntax error, of course!

それは (1,eval) が得られる式で eval (と言うのと同じように)。 (true && eval) または (0 ? 0 : eval) がそうでしょう)、しかし、それは、参照先が eval .

なぜ気にする?

Ecma の仕様では 参照 eval を直接 eval call" にすることはできませんが、単に eval を返すだけの式は間接的なものであり、間接的な eval 呼び出しはグローバルスコープで実行されることが保証されています。

まだ知らないことがある。

  1. どのような状況で、直接 eval は ではなく はグローバルスコープで実行されますか?
  2. どのような状況下で this は、グローバルスコープの関数の ではなく は、グローバルオブジェクトをもたらすか?

さらにいくつかの情報を得ることができます ここで .

EDIT

どうやら、最初の質問に対する答えは、「ほとんど常に」であるようです。 直接 eval から実行されます。 現在の スコープから実行されます。 次のようなコードを考えてみましょう。

var x = 'outer';
(function() {
  var x = 'inner';
  eval('console.log("direct call: " + x)'); 
  (1,eval)('console.log("indirect call: " + x)'); 
})();

驚くことではありませんが(へっへっへ)、これがプリントアウトされます。

direct call: inner
indirect call: outer

EDIT

さらに実験した結果、仮に this に設定することはできません。 null または undefined . 他の偽の値 (0, '', NaN, false) を設定することもできますが、唯一 は非常に を意図的に設定する必要があります。

私は、あなたのソースは軽度の可逆的な頭蓋直腸逆転に苦しんでおり、Haskell でプログラミングして 1 週間過ごすことを検討したいと思うかもしれない、と言うつもりです。