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()
-私は単にこれの背後にあるロジックを理解したい:)