我很困惑为什么下面的 html 不起作用。 我希望它会继续发送警报,但发出警报后就会停止。 此外,“左 fn”警报永远不会发生! 谁能向我解释一下吗? 我在 ubuntu 上的 firefox 中使用 html5 和 javascript。
<!DOCTYPE html>
<script>
function alertme() {
alert ("in fn");
}
while (true) {
window.setTimeout(alertme(), 3000);
alert("left fn");
}
</script>
最佳答案
一些可能的问题:
alertme()
立即被调用,其返回
值被传递给setTimeout()
。要解决此问题,您可以将
alertme
作为引用传递(不带调用括号):setTimeout(alertme, 3000);
但是,这将与 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/