我需要在 for循环中一次打印出 i 的 值。即0,1,2,3,4,5;
首次 书写代码
for(var i = 0;i<lg;i++){// lg = 6
setTimeout(function(){
console.log(i); //此时输出为 6 个 6
},1000)
}
我们想要的结果是在for循环中一次打印出 i 的 值。即0,1,2,3,4,5;但是输出6个相同的个数字是什么原因呢?
这主传进去要是因为setTimeout的执行时异步执行的,而for循环的执行却非常的快,所以,在1s后执行定时器函数时, i 已经 循环到了最大值6,其他的i值已经被销毁,此时再执行定时器,则是把 i=6传进去了,所以造成了这样的结果。
解决这个问题首先是要解决 i 值的变量销毁问题,即浏览器的垃圾回收机制:
将延时器中的函数用一个自执行函数包起来,把每个循环中的 i 在被回收之前直接传入到自执行函数中,这样就可以避免被回收:如下:
for (var i = 0; i < lg; i++) {//lg = 6
(function(a){//自执行函数,获取i
setTimeout(function() {
console.log(a);//操纵变量a,和i无关 此时输出为 0,1,2,3,4,5 且在1s延迟后输出
}, a*1000)//将 i 的值传进来 ,这样就可以每个一秒输出一个值
})(i)
}