当在for循环内加入setTimeout后,由于js是单线程,setTimeout是异步,
那么JS碰到这个有同步和异步的情况下会先从上到下执行同步代码,碰到异步的代码会将其插入到任务队列当中等待。而setTimeout是延时,也就是说碰到setTimeout这个异步的代码块会根据它里面的第二个参数:延时时间来将代码插入到任务队列当中,比如上面这段代码中,第二个参数延时时间是0,也就是说执行到它的时候会在0ms之后将它插入到任务队列当中。同步代码都执行完成之后,那么JS引擎就空闲了,这个时候就轮到任务队列中的异步代码依次加载了。
for( var i=0;i<10;i++){
setTimeout( function(){ console.log(i) }, 5000 )
};
解决方法
for( var i=0;i<10;i++){
(function(e){
setTimeout(function(){
console.log(e)
},5000)}
)(i)
};