2

以下は、対話型コンソール モードでは奇妙な動作が発生しないため、関数スコープ内にある必要があります。

次の関数は期待どおり 5 を返します

(function() { var x = 5; return eval("x"); })()

単純な透過的な (っぽい) 変更:

(function() { var x = 5; var j = eval; return j("x"); })()

エラーが発生します:

ReferenceError: x is not defined

これはある種の奇妙なセキュリティ対策ですか?

4

1 に答える 1

6

2 番目の例は、への間接呼び出しevalです。への間接的な呼び出しevalは、グローバル スコープで評価されます。ここでxは、 は表示されません。

var x = 10;

// This will return 10
(function() { 
    var x = 5; 
    var j = eval; 
    return j("x");
})();

// This will return 5
(function() { 
    var x = 5; 
    return eval("x");
})();

仕様から:

 1. ...eval 関数の直接呼び出しによって eval コードが評価されていない場合

     を。グローバル実行コンテキストであるかのように実行コンテキストを初期化します...

于 2013-04-04T12:16:55.073 に答える