我一直认为,因为JavaScript是单线程的,所以我可以附加事件处理程序,而不用担心处理程序在执行代码时执行。令我惊讶的是,我发现他们可以。根据this answer,,当脚本仍在运行时,“无响应脚本”对话框可能会导致事件发生。可以中断JavaScript执行流程吗?
我用下面的代码测试此:
<script>
function loop() {
var cond;
onblur = function (event) {
cond = false;
};
cond = true;
while (cond)
;
alert('loop exited!');
}
</script>
<button onclick="loop()">loop()</button>
在Firefox 11.0,该函数打印点击继续后, “循环退出”。循环似乎暂停,并允许执行事件。这类似于临时更改目标线程的上下文的Unix signal,。但它更加危险,因为它允许改变外部状态。
这是一个错误?我是否应该不再依赖JavaScript的单流执行模型并确保我的所有脚本都可以重入?或者,尽管有大型浏览器允许这种情况发生,但它是不是值得追求的缺陷?
我想真正的问题是:“标准要求什么。” – 2012-03-19 22:11:21
我认为最好考虑一些内置行为('alert()'等)发生的“暂停”,因为解释器的形式会迫使当前正在运行的函数产生“yield”,然后,当“暂停”完成时,恢复执行。换句话说,认为在“暂停”正在进行的同时实际返回的功能,然后继续作为延续继续。这样,事件处理变得更加有意义,因为它就像普通的事件处理一样。 – Pointy 2012-03-19 22:18:04
获取“无响应的脚本”提示并不是您应该设计的正常事情。你的应用程序坏了,用户从来没有得到这些对话框之一。你应该设计你的脚本,这样就不会出现“无响应的脚本”提示,然后你就不必担心重新进入。在我看来,一个主要的浏览器允许事件在该提示中触发时有点小错误,但我认为修复代码更重要,因此提示从不发生,这不是问题。 – jfriend00 2012-03-19 22:18:10