JS笔记之执行时机与6个6

236 阅读1分钟

代码示例
要求输出: 0 1 2 3 4 5 实际如下


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

setTimeout 会等 for 执行完在进行 六次输出

由于 let i 在外部,for 执行完后 只有一个 i 值 为 6

等到 setTimeout 执行 console.log(i) 时,就会输出 6 个 6

解决办法
let 放里面

for (let i = 0; i < 6; i++) {
  setTimeout(() => {
    console.log(i)
  }, 0)
}
// 这样每次都是不一样的 i 

其他方法如下:

let i
for (i = 0; i < 6; i++) {
  !function (i) {
    console.log(i)
  }(i)
}
let i = 0
for(i = 0; i<6; i++){
  let j = i; // 或者 const 反正每次都不一样
  setTimeout(()=>{
    console.log(j)
  },0)
}
let i = 0
for(i = 0; i<6; i++){
  setTimeout((i)=>{
    console.log(i)
  },0,  i)
}