1

strict モードでは、 への間接呼び出しは eval コードでグローバル オブジェクトにバインドされているeval必要があります。this

10.4.2: 第 5 版では、eval 関数への間接呼び出しは、eval コードの変数環境とレキシカル環境の両方としてグローバル環境を使用します。第 3 版では、間接 eval の呼び出し元の変数および字句環境が、eval コードの環境として使用されました。

ただし、Opera では、この式は次のようになりundefinedます。

(function(){'use strict'; return (0 || eval)('this'); }())

Chrome と Firefox は期待どおりに動作します。

ここでこれを見つけました:http://kangax.github.com/jstests/indirect-eval-testsuite/

これはブラウザのバグですか?もしそうなら、それはまだ追跡されていますか?

Opera と Safari で一部の形式の間接評価が失敗するのはなぜですか?も参照してください。

4

1 に答える 1

3

Opera の ECMAScript エンジンは、コンパイル前に "(0||eval)" を単に "eval" に単純化した、過度に熱心な最適化を行っているようです。この場合、この最適化によってコードの動作が変わるため、バグが発生します。

(Opera の内部では、この問題を CORE-47727 として追跡しています)

于 2012-10-09T13:12:14.583 に答える