Javascript 为什么我将数组值设置为“未定义”

Javascript 为什么我将数组值设置为“未定义”,javascript,node.js,Javascript,Node.js,我是node.js的新手,如果我的问题不成熟,我很抱歉。基本上,我试图遍历一个值数组来执行某些操作,但我不知道为什么我会得到未定义的值 代码: 将变量i=0更改为使i=0 } 注意:当回调函数出现错误时,numOfDocs{…}正在执行for循环,循环结束。若我们声明变量i,那个么在执行回调时,i等于array.length,所以array[array.length]返回未定义。解决方案之一是使用ES6 let,它将为每次迭代创建回调的块范围i。Replace var i = 0; i <

我是node.js的新手,如果我的问题不成熟,我很抱歉。基本上,我试图遍历一个值数组来执行某些操作,但我不知道为什么我会得到未定义的值

代码:

将变量i=0更改为使i=0

}

注意:当回调函数出现错误时,numOfDocs{…}正在执行for循环,循环结束。若我们声明变量i,那个么在执行回调时,i等于array.length,所以array[array.length]返回未定义。解决方案之一是使用ES6 let,它将为每次迭代创建回调的块范围i。

Replace

var i = 0; i < array.length; ++i

问题是,在回调函数中,i的引用只保留一个在调用回调时已经更改的引用

您可以将代码更改为

for (var i = 0; i < array.length; ++i) {
    (function(){
    var index = i;
    console.log(array[index]); //At this point I'm getting values without any problem
    var sQ = {
        _tag: array[index],
        _pid: data.change_caption_post_mail,
        time: data.change_caption_post_time,
    };

    db.collection('tags')
        .find(sQ)
        .count({}, function(error, numOfDocs) {
            if (error) throw err;
            console.log(array[index]);
            //But here I'm getting values as **undefined**
        });
    })();
}

这个调整应该可以很好地工作

你检查过i的值是多少了吗?可能会重复变量i=0,让i=0。可能会重复,我想这与范围无关。如果你观察到变量值在回调函数中没有定义,因为它是异步的。要解决这个问题,你要么给全局变量赋值,要么在回调函数中传递它结果。这个答案没有解释为什么解决了问题,甚至没有解释问题的原因。补充解释。谢谢@connexo!这段代码和OP的代码有完全相同的问题。是的,没错,只要是ES5Great解释,范围仍然需要在函数中,非常感谢您的时间和回答。我不明白您为什么要复制库存答案,而不是将其标记为重复或添加到已发布的重复标志中。我没有足够的声誉来自行决定是否将问题标记为重复。我看到许多问题仍然活跃,因为没有足够的接近票。目前,OP在这里有一个正确而详尽的答案。
var i = 0; i < array.length; ++i
let i = 0; i < array.length; i++
for (let i = 0; i < array.length; i++) {
    console.log(array[i]); //At this point I'm getting values without any problem
    var sQ = {
        _tag: array[i],
        _pid: data.change_caption_post_mail,
        time: data.change_caption_post_time,
    };

    db.collection('tags')
        .find(sQ)
        .count({}, function(error, numOfDocs) {
            if (error) throw err;
            console.log(array[i]);
            // i will be array.length here in all your callbacks
        });
}
for (var i = 0; i < array.length; ++i) {
    (function(){
    var index = i;
    console.log(array[index]); //At this point I'm getting values without any problem
    var sQ = {
        _tag: array[index],
        _pid: data.change_caption_post_mail,
        time: data.change_caption_post_time,
    };

    db.collection('tags')
        .find(sQ)
        .count({}, function(error, numOfDocs) {
            if (error) throw err;
            console.log(array[index]);
            //But here I'm getting values as **undefined**
        });
    })();
}