let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
这段代码打印出的结果为6个6
- 原因
先执行for循环,当i=6时,跳出循环,循环结束后再执行console.log,
setTimeout 尽快 就是忙完手头的事之后马上去执行下一件事
在for循环里就是,先把循环执行完毕再执行console.log
注意
- setTimeout 中的回调是异步执行(计时器由浏览器新开一个线程执行,到点把回调放入宏任务队列;等待同步代码执行完毕 -> 清空当前循环微任务队列(这里微任务队列为空) -> 取出宏任务队列中下一个任务(即 setTimout 回调)执行;
- 执行 setTimeout 回调时如何查找 i 变量。
代码打印 0、1、2、3、4、5 的方法
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
- 原因
简单来讲就是把let写在for循环里面,这样可以单纯为每个i创造一个块级作用域,也就是复制6个i。
这里的变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新变量。
虽然每一轮循环时i都会重新声明,但是JS内部引擎会记住上一轮循环的值,然后复制了一个i的值,在初始化上一轮变量i的同时,保证了下一轮循环可以在上一轮循环的基础上进行计算,每次循环的i其实都是一个新的变量。
其他方法打印出 0、1、2、3、4、5
- 使用立即执行函数
let i = 0
for(i = 0; i<6; i++){
!function(i){
setTimeout(()=>{
console.log(i)
},0)
}(i)
}
本文为张歆辉的原创文章,著作权归本人和饥人谷所有,转载务必注明来源