5

我不明白出了什么问题。我有三个代码:
第一:

<script language="JavaScript" type="text/javascript">
   var count = 0;
   alert(count);
   var timer = setInterval("count = count + 1; alert(count);",10000);
</script>



第二:

<script language="JavaScript" type="text/javascript">
  function countdown()
  {
   var count = 0;
   alert(count);
   var timer = setInterval("count = count + 1; alert(count);",10000);
  }
  countdown();
</script>



第三:

<script language="JavaScript" type="text/javascript">
   var count = 0;
  function countdown()
  {
   alert(count);
   var timer = setInterval("count = count + 1; alert(count);",10000);
  }
  countdown();
</script>



第一个代码工作正常,第二个在“setInterval”行产生错误:“未定义计数”,第三个代码再次正常工作。对于第二个代码中的 setInterval 函数,“count”变量的范围应该是全局的。为什么不是?我正在使用 Mozilla Firefox。谢谢。

4

1 回答 1

8

由于很多原因,其中一个您刚刚遇到,永远不会将字符串传递给setTimeoutor setInterval。曾经。我是认真的。从来没有一个好的理由。

而是传递一个函数。传递函数对象的能力是 JS 最好的特性之一。

var count = 0;
alert(count);

var timer = setInterval(function(){
  count = count + 1;
  alert(count);
}, 10000);

您面临的问题是,以这种方式作为字符串的代码不会尊重范围。它将在全局范围内执行,这是您的变量在第二个和第三个片段中不存在的地方。第一个片段之所以有效,是因为count它确实是一个全局变量。

其他问题源于这样一个事实,这基本上eval伴随着它自己的头痛,最好完全避免。毕竟,Eval 是邪恶的。

于 2012-11-10T21:32:09.880 回答