哪位大佬知道这段代码循环出来的i的值为什么是两次2呀?
发布于 5 年前 作者 guiying82 2519 次浏览 来自 官方Issues

2 回复

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

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

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

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

js执行栈与任务队列

js事件循环

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

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++
} 
回到顶部