for(var i=0;i<2;i++){
setTimeout(function(){
alert(i);
},0);
}
执行上面的代码,大家得到是弹出两次2;
可能大家心里在嘀咕了,我这个定时器不是0ms延迟么?应该弹0,1才对啊。
为什么会产生这样的结果呢?
因为JavaScript 是单线程执行的,也就是无法同时执行多段代码,当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中取出下一个任务。这也常被称为 “阻塞式执行”。
如果代码中设定了一个 setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但不是立即执行,仍然要等待前面代码执行完毕。而在我们这个demo里for循环就是所谓的前面的代码,定时器执行的时机只能是在for循环结束,所以此时的i已经为2了。