1 解释为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
上述代码之中出现6个6的原因在于setTimeout函数是一个异步的函数,上述代码的执行流程为:
- i赋值为0 判断i < 6 ?,满足进入第一循环 setTimeout()会过一会执行–>跳过setTimeout()继续执行
- 执行i++,此时i的值为1 判断i < 6 ?,满足进入第二循环
- setTimeout()会过一会执行–>跳过setTimeout()继续执行 执行i++,此时i的值为2 省略…
- 执行i++,此时i的值为6 判断i < 6 ?,不满足跳出循环 执行第一次循环的setTimeout() //打印出a
- 执行第二次循环的setTimeout() //打印出a 执行第三次循环的setTimeout() //打印出a
- 执行第四次循环的setTimeout() //打印出a 执行第五次循环的setTimeout() //打印出a
- 执行第六次循环的setTimeout() //打印出a 结束
为什么?因为setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,意思就是不用再等多少秒了,只要主线程执行栈内的同步任务全部执行完成,栈为空就马上执行。也就是当同步任务的函数和语句执行完后,0秒或者立刻执行setTimeout(fn,0)。
2 写出让上面代码打印 0、1、2、3、4、5 的方法
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
3 其他方法
利用 const 关键字
let i
for(i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}