Tim*_*003 20 javascript concurrency javascript-events
我一直认为,由于JavaScript是单线程的,我可以附加事件处理程序而不必担心处理程序在执行代码时会被执行.令我惊讶的是,我发现他们可以.根据这个答案, "无响应脚本"对话框可能会导致在脚本仍在运行时引发事件.
我用以下代码测试了这个:
<script>
function loop() {
var cond;
onblur = function (event) {
cond = false;
};
cond = true;
while (cond)
;
alert('loop exited!');
}
</script>
<button onclick="loop()">loop()</button>
Run Code Online (Sandbox Code Playgroud)
在Firefox 11.0中,该功能在单击"继续"后打印"循环退出".循环似乎暂停,允许执行事件.这类似于Unix信号,它暂时改变目标线程的上下文.但它更危险,因为它允许外部状态被改变.
这是一个错误吗?我是否应该不再依赖JavaScript的单流执行模型并确保我的所有脚本都是可重入的?或者这是一个不值得追求的缺陷,尽管主流浏览器允许这种情况发生?
所以,是的,如果你创建一个无限循环,你的 JavaScript 就会挂起。不同的浏览器会以不同的方式处理这个问题。Firefox 11 对我来说会弹出一个窗口,提示您的脚本已挂起。Chrome 此刻正在为我旋转。
这应该证明了这一点。alert()切勿在 FF11 或 Chrome 17 中调用。
while(true){}
alert("sucks");
Run Code Online (Sandbox Code Playgroud)
您询问了 JavaScript 中的同步语句。还有一些其他同步语句会阻止 JavaScript 的执行alert(),例如confirm()同步 ajax 调用等。
您通常希望避免 JavaScript 中任何类型的同步内容!如果您希望事情暂停,您可能需要重新考虑设计。JavaScript 是事件驱动的。您不需要它在 while 循环中旋转,因为页面上的任何内容都不起作用,包括单击等任何事件。