1.一段代码的执行结果是什么?
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
答案:6 6 6 6 6 6。
setTimeout是异步任务,会被放进另外一个异步任务队列里排队。先把for循环完,再执行异步队列中的任务。因为全局只有1个i,for循环结束之后,i=6。等到执行setTimeout的时候,每次console.log中的i都是6.for循环了6次(0,1,2,3,4,5),所以是6个6.
2. 如何打印出0,1,2,3,4,5?
- 答案
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
- 解析: 因为let的作用域为当前循环。所以每次循环都是一个新的i。
- 你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
3. 还有其他方法吗?
方法一:循环内部创建一个新变量,保存每次的i
let i = 0
for(i = 0; i<6; i++){
let j =i
setTimeout(()=>{
console.log(j)
},0)
}
//=> 0,1,2,3,4,5