这样一段代码:
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
按照平时的想法,输出结果应该是0,1,2,3,4,5
但是实际输出的结果确实6,6,6,6,6,6
原因是setTimeout这个函数会让里面的代码console.log(i)等一会再执行,等多久呢,等到for循环完然后执行,此时的i已经自增到6了,打印六次就会都是6了
如图,for循环中的另一个打印输出六次‘---’之后,显示for返回值为undefined,然后再输出六次6,说明setTimeout是在for循环之后再打印的
想让for循环正常输出的方法:使用let声明i,并且放在for循环条件中
这是es6给新人专门做的优化
但是还有什么办法能够这样输出呢
let i;
for (i = 0; i < 6; i++) {
setTimeout((function(i){
console.log(i);
}(i)),0)
}
上述结果输出为0,1,2,3,4,5
我的理解是将setTimeout中加一个立即执行函数,函数的参数就是此时for循环的i的值,此时打印在for循环完成之前就完了
在网上看到一段这样的代码,
for (var i = 0; i < 6; i++) {
setTimeout((function(i){
return function() {
console.log(i);
}
}(i)),0)
}
也能按要求打出来,并且是在for循环结束之后打出结果