57

eval()非厳密なコンテキストでどのように機能するかは理解していeval()ますが、厳密なモードで使用する場合は完全に混乱しています。がeval()グローバル スコープで直接呼び出されると、変数は新しいeval()スコープ内に保持されます。

'use strict';
eval('var a = 1;');
console.log(a); // ReferenceError: a is not defined

ただし、グローバル スコープで間接呼び出しを実行するeval()と (同じはずですよね?)、strict モードではないかのように動作します (信じられない場合は、この JSFiddleを参照してください)。

'use strict';
(0, eval)('var a = 1;'); // indirect call to eval
console.log(a); // 1???

機能の説明については、 「 Google のメイン ページが (0, obj.func)(args) 構文を使用する理由」(0, eval)を参照してください。.

eval()が厳密モードでどのように機能するかについての私の理解によれば、 (eval()直接または間接的に呼び出されるかどうかに関係なく) 呼び出しで定義された変数の新しいスコープを作成することを意図していeval()ますが、これはそうではないようですケースはこちら。(ECMA-262 仕様第 5 版10.4.2 )

これはすべての主要なブラウザー (Internet Explorer 10、Chrome 30、Firefox 24 を含む) に当てはまるため、バグではないと思います。どちらも同じことを意図しているのではありませんか? そうでない場合、なぜそうなるのでしょうか?

注:はい、私は使用の「危険性」を知っていますeval()-私は単にこれの背後にあるロジックを理解したい:)

4

1 に答える 1