for(var i = 0; i < 100000; i++){
setTimeout(function(){
console.log("Inside")
}, 0);
console.log("Outside")
};
它给出输出:
外部* 100000
内部* 100000
为什么要输出?
CPU绑定的活动是在线处理的,当所有CPU绑定的活动结束时,它将处理事件que?
答案 0 :(得分:0)
setTimeout()
是非阻塞的,它异步地调用它的回调。这意味着setTimeout()
运行,为将来安排计时器,然后立即返回。然后,在某个时间之后,当计时器触发时,它将在事件队列中插入一个事件。当解释器执行完其他Javascript后,它将从事件队列中提取下一个事件,然后将运行计时器回调。
因此,这就是您的代码中发生的事情:
for
循环的主体100,000次,每次循环,安排一个计时器,然后输出console.log("Outside")
。for
循环完成并且控制权返回系统时,检查事件队列以查看是否存在事件。0
,因此队列中可能有很多计时器事件。拉出第一个事件并运行它的回调,该回调将输出console.log("Inside")
。这里有两个键:
setTimeout()
是“非阻止”。它安排了计时器并立即返回。这意味着所有同步代码首先都必须先完成,然后才能从事件队列中获取任何异步回调并运行。