JS 函数的执行时机

一、 解释为什么如下代码会打印 6 个 6

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

setTimeout函数会优先执行之前的事件,最后再执行后续的事件。而之前的事件是i循环,显然得等i循环执行完毕再执行打印出i的这个函数,当i等于5时,因为小于6会再执行一次,直到i等于6,一共执行了6次,根据前面所诉会打出6个6,而非6个5。

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

如果对于for循环使用setTimeout()的循行结果不满意,我们就是要打印0、1、2、3、4、5呢?
可以这样写

for(let i = 0; i<6; i++){
    setTimeout(()=>{
        console.log(i)
    },0)
}
// 0 1 2 3 4 5

因为在for语句里用let声明变量是局部变量遵循块作用域,所以每次for循环执行时都会生成一个单独的作用域,也会生成一个新的i,相当于有6个i。 此时,每次执行setTimeout()时都会打印出对应的i,打印结果就是0、1、2、3、4、5了。

三、其他方法可以打印出 0、1、2、3、4、5

let i = 0;
while (i < 5) {
  i++;
  console.log(i)
}

推荐阅读更多精彩内容