1:为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){ setTimeout(()=>{
console.log(i)
},0)
}
回答这个问题之前,先介绍一下setTimeout:
setTimeout(func,time)是在time(毫秒单位)时间后执行func函数。
它的运行机制是:
浏览器引擎按顺序执行程序,遇到setTimeout会将func函数放到执行队列中,等到主程序执行完毕之后,才开始从执行队列(队列中可能有多个待执行的func函数)中按照time延时时间的先后顺序取出来func并执行。 即使time=0,也会等主程序运行完之后,才会执行。
所以上述问题的原因是定时函数被加入执行队列,等主程序执行完后,此时才调用定时函数,i的值已经变成了6,所以打印出6个6;
2:写出让上面代码打印 0、1、2、3、4、5 的方法
(1):使用 for let 配合
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
(2):使用立即执行函数
for(var i = 0; i<6; i++){
setTimeout(
!function (){console.log(i)}()
,0)
}