JS 函数的执行时机

213 阅读1分钟

1. 为什么以下代码会打出6个6?

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

个人理解:

因为当setTimeout执行的时候,for循环已经完成,for循环完成时i的值为6,而且全局只有一个i,这个i只能循环6次。

思路大概是这样

for(i=0) —> for(i=1) —> for(i=2) —> for(i=3) —> for(i=4) —> for(i=5) —> for(i=6) —> console.log(6) —> console.log(6) —> console.log(6) —> console.log(6) —> console.log(6) —> console.log(6) —>执行完成

2. 写出让上面代码打印 0、1、2、3、4、5 的方法?

for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

个人理解:

js并不是每次循环都将新值i覆盖旧值i,而是每一次循环都新创建了一个新的i,而新创建的i的作用范围只在for循环的两个括号内 ,所以6次循环所关联的闭包是6个不同的i

3. 除了 for let 配合,还有什么其他方法可以打印出 0、1、2、3、4、5?

for(let i = 0; i<6; i++){
const x = i
setTimeout(()=>{
console.log(x)    
})
}