1、 解释为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
每一次进行for循环,setTimeout都会执行一次,但函数并没有被执行。这是因为函数是在在for循环的所有条件判断执行完成之后才会开始执行。而当执行完for循环后,i的值已经变为6了,所以执行函数会打印出6个6。i 定义的是一个全局变量,for循环每次获取的 i 值都会覆盖上次获取的 i 的值。
总结一下就是:for循环并没有在每次循环的时候输出 i 的值,而是在循环完成之后,i 已经变为了6之后,才进行的输出。
2、写出让上面代码打印 0、1、2、3、4、5 的方法
for(let i = 0; i<6; i++){ //将i=0修改为let i = 0
setTimeout(()=>{
console.log(i)
},0)
}
3 、除了使用 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?
由题目一可知,由于i是个全局变量,导致每次i的值发生变化都会覆盖掉原先的值。所以这里可以在内部引入一个局部变量将i的值保存起来。
let i = 0
for(i = 0; i<6; i++){
(function (i) {
setTimeout(()=>{
console.log(i)
},0)
})(i)
}
这样输入后会返回0、1、2、3、4、5,但输出console.log(i)时会输出6.