解释为什么如下代码会打印 6 个 6
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
执行结果如下:
期待得到的结果是0、1、2、3、4、5 ,但最终得到的结果是6个6,原因如下:
- setTimeout延时器里面的代码不会立即执行,而是将代码放到等待队列中,因此队列中会有6个console.log(i),等待区域内其他主程序执行完毕后再执行;
- for循环作为主程序,执行完之后i=6。
- 主程序执行完之后再依次执行6个console.log(i),得到的结果即为6个6。2. 如何打印出预期结果
如何打印出 0、1、2、3、4、5
通过修改以上代码可以打印出 0、1、2、3、4、5 ,代码如下:
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
执行结果如下:
这是因为ES6新语法,for与let结合时,每次循环都会将i的值保存在本次循环里,所以最后会打印出预期结果。
其他方法可以打印出 0、1、2、3、4、5
let i = 0
for(i = 0; i < 6; i++){
const x = i
setTimeout(()=>{
console.log(x)
})
}
执行结果如下: