收藏
回答

哪位大佬知道这段代码循环出来的i的值为什么是两次2呀?

回答关注问题邀请回答
收藏

2 个回答

  • 微盟
    微盟
    2021-06-18

    var变量异步的经典问题。也是let产生的原因。

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


    推荐搜索学习js相关知识:

    js执行机制中的同步与异步的概念与区别

    js执行栈与任务队列

    js事件循环

    2021-06-18
    有用
    回复
  • ؞咬了你؞F࿆ū࿆t࿆ū࿆r࿆ē࿆
    ؞咬了你؞F࿆ū࿆t࿆ū࿆r࿆ē࿆
    2021-06-17

    你在一个循环里调用一个异步方法,当然会这样。

    db.xxxxx.then里面是异步调用的,可能调用完的时候,你的循环早跑完了,捕捉进去的i自然是循环结束后的值


    建议你要么写成async await

    要么

    var i = 0
    while (i < 2) {
        (_i => {
            db.xxxxxxxxxxx
              .then(res => {
                  console.log(_i)
              })
        })(i)
        i++
    } 
    

    或者

    var i = 0
    while (i < 2) {
        let _i = i // 别用var
        db.xxxxxxxxxxx
          .then(res => {
              console.log(_i)
          })
        i++
    } 
    
    2021-06-17
    有用
    回复
登录 后发表内容