JavaScript事件循环:为什么我的click函数在队列中的其他任务之前执行?

时间:2017-03-05 16:19:11

标签: javascript jquery event-loop

据我所知,JavaScript事件队列由Interface Builder等浏览器事件或click等延迟函数填充。然后事件循环将持续检查当前调用堆栈,如果它为空,它将执行队列中的第一个任务,直到完成任务。之后,队列中的下一个任务将被执行,等等。

所以我认为以下函数应该用1000 setTimeout个函数填充队列:

delay

这意味着现在队列中有1000个函数。如果延迟需要一些时间来执行,这应该会阻塞队列很长一段时间。但正如您在所提供的片段中看到的那样,似乎不是真的(单击" Do Many!"按钮,这将启动超时,然后单击" Do一次!"按钮,看它也能正常工作)

所以即使我将所有这些函数添加到队列中,我仍然可以单击一个按钮,function run() { for (var i = 0; i < 1000; i++) { setTimeout(delay, 0); } } 事件处理程序仍将在两者之间执行,尽管它稍后被添加到队列中。为什么会这样?

&#13;
&#13;
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;
&#13;
&#13;

0 个答案:

没有答案