for(var i=0;i<10;i++){
setTimeout((function(i){
console.log(i)
})(i),2000*i)
}
这样写一个立即执行函数,会0秒打印出0~9,为何2000*i这个没有生效?但是里面的i确实变了啊。for循环时,难道是setTimeout(fun,0)?我把时间设置为10s,也是立即打印的,为什么?
for(var i=0;i<10;i++){
setTimeout((function(i){
return function(){
console.log(i)
}
})(i),2000*i)
}
我这样写结果是对了,每隔2s打印i,整个函数的执行流程是怎么样的,我的理解如下
执行for循环时,立即绑定10个
setTimeout((function(){})(0),0)~setTimeout((function(){})(9),9)
然后0秒执行第一个setTimeout
你的第一个种写法,其实是立即执行函数,实际效果直接写console.log(i)是一样的,因此会立即执行,因为是匿名函数,所以执行完之后立即销毁。所以导致setTimeout里的第一个参数变成了undefiend,所以setTimrout不会执行,最终你看到的就是立即输出0-9
而第二种写法则是运用了闭包,所以会保存调用环境,因此可以每2s打印一次。
Update: 稍微更改了下叙述,便于理解。