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. 这就是第二个警报给出的原因22

于 2012-12-29T19:52:49.447 回答
1

由于您在本地范围内没有变量,因此它会更改全局变量。试试下面这个。它将打印 100 而不是 22。

<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 的使用,正在发生的事情可能会更明显 - 您正在重新定义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 回答