2

evalOpera や Safari では、いくつかの形式の間接的な失敗が見られます。

[eval][0]('')

未処理のエラー: 無効なこのオブジェクトで呼び出された eval

空の文字列を評価すると失敗することに注意してください...私が知る限り、それは返されるはずundefinedです。

のような他の形式は、(0,eval)('')正常に動作するようです。

kangax によるこのテスト スイートの例を実行すると、Opera では「このオブジェクトが無効です」というメッセージで失敗するフォームがいくつか見られますが、Chrome や Firefox ではそうではありません。

なぜこれが起こるのか誰か説明できますか?この動作を決定するものは何ですか? 意図的なようですが、私が知らない標準の一部に準拠していますか?

関連 -間接評価と直接評価に関するSO の議論。

また -- (0 || eval) が Opera で間接として扱われないのはなぜですか?

4

2 に答える 2

2

これは単純に、ECMAScript 262 第 3 版が通常とは異なる eval() 呼び出しに対してやや奇妙なオプションの例外を指定したためです。仕様のこのセクションの最後の部分を参照してください: http://bclary.com/2004/11/07/#a-15.1.2.1

eval プロパティの値が直接呼び出し以外の方法 (つまり、その名前を CallExpression の MemberExpression である識別子として明示的に使用すること以外) で使用されている場合、または eval プロパティが割り当てられている場合、 EvalError 例外がスローされる場合があります。

この文の背後にある理由は完全にはわかりませんが、ご覧のとおり、Opera の Carakan エンジンと Safari の ES エンジンの両方が、eval への参照が何らかのオブジェクトで定義され、そこから呼び出された場合に例外を実装することを選択しています。

ECMAScript 標準の後の版ではこれが削除され (仕様にオプションの例外を含めることは、そもそも非常に悪い考えです)、Opera は将来の Carakan バージョンで適応する予定です。StackOverflow に関するこれらの質問により、すでに内部で修正されています ;)

于 2012-10-10T08:30:49.267 に答える
0

私はそれを実行していると思います:

[eval][0]('something');

関数内の配列thisと等しくなります。[eval]eval

ランニング:

[eval][0].call(window, 'something');

グローバルオブジェクトと等しくする必要がthisありますが、それらのブラウザーでその場合に機能するかどうかはわかりません。

于 2012-10-01T00:27:14.910 に答える