JS 函数的执行时机

180 阅读1分钟
  • 执行时机,或调用时机,是 JS 函数的要素之一
  • JS 函数的执行时机不同,结果不同

「一」异步案例

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
// 上面代码会打印 6 个 6,而不是想象中的 0 1 2 3 4 5  

🧐 为什么上面代码会打印 6 个 6 ?!
∵ setTimeout是一个异步任务,会等到当前代码的for循环执行完了,再去执行 console.log(i),而for循环执行完之后,i已经是6了
∴ 会打印出6个6

「二」如何让上面代码打出0、1、2、3、4、5

💡方法1

利用forlet配合

for(let i = 0; i < 6; i++){
  setTimeout(()=>{ 
    console.log(i)
  },0)
}
  • 相当于每轮循环创建了一个作用域 { }
  • 在每次执行循环体之前,JS 引擎会把 i 在循环体的上下文中重新声明及初始化一次
  • 那样的话,6 次循环,就会有 6 个不同的 i,console.log 出来的 i 当然也是不同的值

💡方法2

  • 利用 setTimeout 的第三个参数,将 i 传进去
let i
for(i = 0; i < 6; i++){
    setTimeout((i)=>{
      console.log(i)
    },0,i)
}

💡方法3

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

💡方法4

  • 利用「立即执行函数」的参数,保存下 i
for (var i = 0; i < 6; i++){
  ! function(j){
    setTimeout(function(){
      console.log(j)
    }, 0)
  }(i)
}

⭐ 推荐阅读: 我用了两个月的时间才理解 let