0

我对为什么以下 html 不起作用感到困惑。我希望它会继续发送警报,但它会在一个之后停止。此外,永远不会出现“left fn”警报!谁能给我解释一下?我在 ubuntu 上的 firefox 中使用 html5 和 javascript。

<!DOCTYPE html>
   <script>
      function alertme() {
      alert ("in fn");
      }

      while (true) {
       window.setTimeout(alertme(), 3000);
   alert("left fn");
      }
   </script>
4

2 回答 2

2
while (true) {
    window.setTimeout(alertme, 3000); //setTimeout wants a function, not the return value of the function
    alert("left fn");
}

顺便说一句,玩得开心,把所有的消息框都删掉……

于 2013-02-19T23:47:19.217 回答
2

几个可能的问题:

  1. alertme()被立即调用,它的return值被传递给setTimeout().

    alertme要解决此问题,您可以作为参考传递(不带调用括号):

    setTimeout(alertme, 3000);
    
  2. 但是,这将与 JavaScript 的(主要)单线程特性相冲突。

    s 是异步的,只需启动一个从现在开始不少于3 秒setTimeout()到期的计时器。但是,它们要求一个线程最终不忙,以便执行延迟的任务。

    但是,while (true) {}同步且不确定的 将保持线程忙碌,直到所有执行停止,并且永远不会允许超时执行其任务。所以,你永远不会看到"in fn"

    John Resig 写了一篇关于计时器的文章: http: //ejohn.org/blog/how-javascript-timers-work/

如何准确地修复代码取决于意图。

于 2013-02-19T23:56:25.233 回答