函数执行时机的案例
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
} //6,6,6,6,6,6
因为 i 是全局的。for 循环执行完毕之后 i 的值为6。i = 5 满足条件(<6)是最后一轮循环,然后i++,i 为6。这个循环自始至终都是在改变一个 i 的值。所以会打印6个6。也就是先执行循环,在这个任务同步任务完全执行后,在进入定时器这个异步任务,因为JS是单线程的
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
} //0,1,2,3,4,5
这里 let 会单独创建一个作用域 相当于有6个 i ,在循环时会将每个i保存下来,这样就是实现了0到5的输出
for (var i = 0; i < 6; i++) {
setTimeout((function(i){
return function() {
console.log(i);
}
}(i)),0)
}
// 0 1 2 3 4 5
同样可以输出0到5,因为函数是先调用后执行。