javascript - html5 和 JavaScript : is setTimeout breaking this?

标签 javascript html settimeout

我很困惑为什么下面的 html 不起作用。 我希望它会继续发送警报,但发出警报后就会停止。 此外,“左 fn”警报永远不会发生! 谁能向我解释一下吗? 我在 ubuntu 上的 firefox 中使用 html5 和 javascript。

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

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

最佳答案

一些可能的问题:

  1. alertme() 立即被调用,其返回值被传递给 setTimeout()

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

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

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

    但是,while (true) {} 是同步且无限期的,将使线程保持忙碌状态,直到所有执行都停止,并且永远不会允许超时来执行其任务。因此,您永远不会看到“in fn”

    John Resig 对计时器有一篇很好的文章:http://ejohn.org/blog/how-javascript-timers-work/

具体如何修复代码取决于意图。

关于javascript - html5 和 JavaScript : is setTimeout breaking this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14969785/

相关文章:

javascript - 如何从数组中删除对象并更新所有其他对象的位置值?

javascript - 如何使用 jQuery 的 JavaScript 将值 POST 到下一页?

javascript - 为什么嵌入 HTML 中的脚本标记可以正确运行,但不能由 aspx 生成?

javascript - jQuery 回调到非 jQuery 父对象

angular - 向返回 promise 的 javascript 方法添加延迟

javascript - 使用 ng-class 和 ng-change 在元素中动态设置类

javascript - 如何将 JavaScript 控制台转发到 Cocoa XWebView?

javascript - 初始化多个变量时如何减少代码量

javascript - 模态外部 URL 重定向不当

javascript - 防止 onbeforeunload 函数暂停 Javascript 计时器