我们先来看一段代码:

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

    请问:i会打印出什么呢?
    到浏览器跑一遍代码会发现输出的是:6个6,原因如下:
    因为setTimeout是一个异步任务,执行到这里的操作会被浏览器丢到另一个任务队列里去, 浏览器这时候会继续执行for循环。每一次for循环的时候,setTimeout都执行一次,但是里面的函数没有被执行,而是被放到了任务队列里面,等待执行,for循环了6次,就放了6次,当主线程执行完成后,才进入任务队列里面执行。这时候因为for循环i=6了,所以输出的全部都是6
    问:如何让它输出0-5呢?

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

    理由:因为let变量的作用域只能在当前函数中,所以每次for循环生成的都是一个新的i, setTimeout里输出的i就是这个新的i,这个i是不会变化的,所以输出的就是正常的
    3、除了以上方式,还有什么方式打印0、1、2、3、4、5?

    • 闭包

      1. let i
      2. for(i = 0; i<6; i++){
      3. !function(j){
      4. setTimeout(()=>{
      5. console.log(j)
      6. },0)
      7. }(i)
      8. }
    • 利用setTimeout的第三个参数,将i传进去。

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

      参考:https://zhuanlan.zhihu.com/p/93371593