Javascript ReactJS for循环仅显示firebase查询中的最后一个值

Javascript ReactJS for循环仅显示firebase查询中的最后一个值,javascript,reactjs,Javascript,Reactjs,我正在尝试使用for循环来循环数组。变量进入firebase查询后,仅显示最后一个值。知道为什么会这样吗 const handleClose = () => { var tpList = TP; for (var v in tpList) { var tp = tpList[v]; console.log(tp); Firebase.database().ref("Student").c

我正在尝试使用for循环来循环数组。变量进入firebase查询后,仅显示最后一个值。知道为什么会这样吗

const handleClose = () => {
        var tpList = TP;
        for (var v in tpList) {
            var tp = tpList[v];
            console.log(tp);
            Firebase.database().ref("Student").child(tp + "/Name/").once('value').then((res) => {
                console.log("Name of " + tp + " is " + res.val());
            })
        }

第一个控制台日志工作正常,显示索引0-5中的正确值。但是,第二个控制台日志仅显示索引值5。有什么建议这里可能有什么问题吗?

如评论中所述,您应该在循环中使用
let
而不是
var

const handleClose = () => {
    var tpList = TP;
    for (let v in tpList) { // Use let here
      let tp = tpList[v];   // (optional) Also here to keep the scope inside the loop
      console.log(tp);
      Firebase.database().ref("Student").child(tp + "/Name/").once('value').then((res) => {
        console.log("Name of " + tp + " is " + res.val());
      })
    }

原因是,在ES6中,当在循环中使用
let
时,声明的变量将为循环的每次迭代获得一个新绑定,因此闭包将正确捕获
v
的每个值,使用
var

时,不要只捕获最后一个变量,而要在循环中使用
而不是
var
。如果答案有帮助,你应该接受/upvote。@giorgim我接受了,但我收到通知说“记录声誉低于15的人的投票,但不改变公开显示的post分数。”:(请解释为什么在for循环中使用let而不是var,可能是关于java脚本中变量词法范围的一些见解…)。。。。