let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
上面的代码执行结果是6个6,因为settimeout函数是指定某个任务在主线程最早可得的空闲时间执行,意思就是不用再等多少秒了,只要主线程执行栈内的同步任务全部执行完成,栈为空就马上执行。而即便主线程为空,0毫秒实际上也是达不到的。根据HTML的标准,最低是4毫秒。for循环先执行,最后i=6,而循环执行了6次,所以结果是6个6。
but
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
执行的结果是0,1,2,3,4,5,这时let会单独创建一个作用域,即:
(let i = 0) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 1) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 2) {
setTimeout(()=>{
console.log(i)
},0)
};
(let i = 3) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 4) {
setTimeout(()=>{
console.log(i)
},0)
}
(let i = 5) {
setTimeout(()=>{
console.log(i)
},0)
};