1
<script type="text/javascript">

  var number = "10";

  (function(){
    alert(number);    
    alert(eval('number=22'));

  })();

  var func = function() {
      alert (new Function( 'return (' + number + ')' )());
  }

  func(); // prints 22.

</script>

最初にアラートを出し10、次にアラートを出し22、なぜアラートを出すのか22 again instead of 10。eval関数はグローバルスコープの変数をオーバーライドしますか?

4

3 に答える 3

4

いいえ、evalグローバルスコープでは実行されませんが、numberローカルスコープで名前が付けられた変数がありません。つまり、グローバルなものを変更しているのです。

あなたはこの小さな変化でそれを見るかもしれません:

(function(){
  var number; // this will ensure the global number isn't changed
  alert(number);  // this will print "undefined"
  alert(eval('number=22')); // this won't change the global variable
})();

alert(eval('number=22'));評価の結果を返し、をnumber=22返すことに注意してください22。これが、2番目のアラートが与える理由22です。

于 2012-12-29T19:52:49.447 に答える
1

ローカルスコープに変数がないため、グローバルスコープが変更されます。以下でこれを試してください。22ではなく100を出力します。

<script type="text/javascript">


  var number = 100;

  (function(){
    var number;
    alert(number);    
    alert(eval('number=22'));

  })();

  function func() {
      alert (new Function( 'return (' + number + ')' )());
  }

  func();

</script>
于 2012-12-29T20:04:42.750 に答える
0

evalは悪です

使用しないでください

evalの使用を削除すると、何が起こっているのかがより明白になる可能性がありますnumber。最初の無名関数内のグローバル変数の値を再定義しています。

var number = "10";

(function(){
    number = 22; // this is a reference to the global variable `number`
})();

var func = function() {
    alert (new Function( 'return (' + number + ')' )()); // this is another use of eval - don't do this
}

func(); // prints 22 - expected.
于 2012-12-29T20:01:05.620 に答える