JavaScript 是单线程执行的,也就是无法同时执行多段代码。当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中取出下一个任务。这也常被称为 “阻塞式执行”。
setTimeout(fn,0): 这个时间设为 0,就代表立即插入队列,但不是立即执行,仍然要等到主线程把"任务队列"现有的事件都处理完,才会得到执行。所以 setTimeout 并不能保证执行的时间,是否立即执行,取决于 JavaScript 线程是拥挤还是空闲。
在某种程度上,我们可以利用setTimeout(fn,0)的特性,修正浏览器的任务顺序。
console.log(1);
setTimeout(function(){
console.log(2);
}, 0);
console.log(3);
执行j结果为:1,3,2