据我所知,JavaScript事件队列由Interface Builder
等浏览器事件或click
等延迟函数填充。然后事件循环将持续检查当前调用堆栈,如果它为空,它将执行队列中的第一个任务,直到完成任务。之后,队列中的下一个任务将被执行,等等。
所以我认为以下函数应该用1000 setTimeout
个函数填充队列:
delay
这意味着现在队列中有1000个函数。如果延迟需要一些时间来执行,这应该会阻塞队列很长一段时间。但正如您在所提供的片段中看到的那样,似乎不是真的(单击" Do Many!"按钮,这将启动超时,然后单击" Do一次!"按钮,看它也能正常工作)
所以即使我将所有这些函数添加到队列中,我仍然可以单击一个按钮,function run() {
for (var i = 0; i < 1000; i++) {
setTimeout(delay, 0);
}
}
事件处理程序仍将在两者之间执行,尽管它稍后被添加到队列中。为什么会这样?
click
&#13;
$(function () {
$("#do-many").click(run);
$("#do-once").click(single);
});
var counter = [0,0];
function run() {
for (var i = 0; i < 1000; i++) {
setTimeout(delay, 0);
}
}
function delay() {
for (var i = 0; i < 10000000; i++) {
}
update(0);
}
function single() {
update(1);
}
function update(idx) {
counter[idx] += 1;
$("#c" + idx).text("Count " + idx + ": " + counter[idx]);
}
&#13;