JS 加油包之函数的执行时机

142 阅读1分钟

经典题目:6个6

1. 为什么是6个6

let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}
  • 上述代码会打印出6个6,因为setTimeout表示过一段时间打印,这是一个异步任务
  • 浏览器此时会继续向下执行下面的代码,然后再来执行setTimeout函数里的操作
  • 所以过段时间后for循环已经把i从0增加到了6,打印的结果是6个6

2. 如何打印出 0 1 2 3 4 5

for(let i=0; i<6; i++){
  setTimeout(()=>{
  console.log(i)
  },0)
}
  • 此时的i定义到了for循环中,因为let变量的作用域只能在当前函数中,所以每次循环都会创建一个新的i
  • i的值在setTimeout里输出的就是依次叠加的0、1、2、3、4、5

3. 不用for let 配合打印出 0 1 2 3 4 5

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

Reference List
JavaScript教程-定时器: wangdoc.com/javascript/…
博客-JS函数的执行时机:blog.csdn.net/cainiao1412…
博客-JS函数的运行时机: juejin.cn/post/684490…