循环中加定时器 i的问题

来源:互联网 发布:易语言运行js脚本 编辑:程序博客网 时间:2024/05/13 10:35
for(var i=0;i<2;i++){        setTimeout(function(){            alert(i);        },0);}

执行上面的代码,大家得到是弹出两次2;
可能大家心里在嘀咕了,我这个定时器不是0ms延迟么?应该弹0,1才对啊。
为什么会产生这样的结果呢?

因为JavaScript 是单线程执行的,也就是无法同时执行多段代码,当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中取出下一个任务。这也常被称为 “阻塞式执行”。

如果代码中设定了一个 setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但不是立即执行,仍然要等待前面代码执行完毕。而在我们这个demo里for循环就是所谓的前面的代码,定时器执行的时机只能是在for循环结束,所以此时的i已经为2了。

0 0