(1,eval)
とプレーンオールドの違いeval
は、前者は値であり、後者は左辺値であるということです。それが他の識別子である場合は、より明白になります。
var x;
x = 1;
(1, x) = 1;
それは(言うように、またはそうするように)(1,eval)
降伏する式ですが、それはへの参照ではありませんeval
(true && eval)
(0 ? 0 : eval)
eval
。
なんで気にするの?
まあ、Ecmaの仕様は考えて参照するにはeval
、「直接evalの呼び出し」を可能にするが、表現のことを単に利回りeval
間接評価呼び出しになる式は、グローバルスコープで実行されることが保証されています。
私がまだ知らないこと:
- 直接評価呼び出しがグローバルスコープで実行されないのはどのような状況ですか?
- どのような状況
this
で、グローバルスコープの関数がグローバルオブジェクトを生成できないのでしょうか。
ここでさらにいくつかの情報を収集できます。
編集
どうやら、私の最初の質問に対する答えは、「ほとんど常に」です。直接eval
は現在のスコープから実行されます。次のコードについて考えてみます。
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
当然のことながら(heh-heh)、これは次のように出力されます。
direct call: inner
indirect call: outer
編集
さらに実験を重ねた後、暫定的this
にnull
またはに設定できないと言いundefined
ます。他の偽の値(0、 ''、NaN、false)に設定できますが、非常に限られています意図的なものに。
私はあなたの情報源が穏やかで可逆的な頭蓋直腸の反転に苦しんでいると言うつもりであり、ハスケルで1週間のプログラミングを過ごすことを検討したいかもしれません。