了解执行模型和事件循环

dam*_*uar 2 javascript event-loop

我已经阅读了很多有关JavaScript单线程执行模型,事件循环和事件队列的文章。

有一件事还不清楚。我创建了一个小提琴来说明我的问题:http : //jsfiddle.net/yzpmf67f/

<button onClick="window.compute()">Do computation</button>
<button onClick="alert('doing')">Do something else</button>

window.compute = function compute() {
var result = 0;
for (var i = 0; i < 100000; i++) {
    for (var j = 0; j < 100000; j++) {
        result = i + j;
    }
};
var textnode = document.createTextNode(result);
document.body.appendChild(textnode);
Run Code Online (Sandbox Code Playgroud)

}

如果单击“执行计算”按钮,将需要一些时间并阻塞页面。但是,如果单击“执行其他操作”按钮,则页面仍处于挂起状态时,它仍将添加到队列中并在我们的计算完成后执行。

因此,如果JS是单线程的,谁在我们计算其他内容时将UI事件放入事件队列?

Ber*_*rgi 5

因此,如果JS是单线程的,谁在我们计算其他内容时将UI事件放入事件队列?

显然不是JS :-)这是浏览器中的其他线程之一,在这种情况下,它是负责管理UI事件(依次由OS提供)的线程。实际上,有很多事情与JS引擎并行运行,例如管理网络连接(和排队ajax事件)的线程。

  • @damluar在超时发生之前,事件不会添加到队列中。脚本主机如何处理超时是一个实现细节(即,它会因浏览器等而异)-只有在超时结束后,脚本主机才会将回调置于执行队列中。 (2认同)