这就需要搞清楚一个很重要的概念:js是单线程的,单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。
setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,也就是说,尽可能早得执行。它在"任务队列"的尾部添加一个事件,因此要等到同步任务和"任务队列"现有的事件都处理完,才会得到执行。
setTimeout(function(){
console.log(1);
}, 0);
console.log(2);
console.log(3);
这样,这段代码输出结果为2 , 3 ,1。就得到了解释,因为setTimeOut设置为0,会在队列最后添加一个事件,要等待其他任务事件处理完成才会处理,所以 1 才会最后打印;