for循环中的Javascript新运算符

for循环中的Javascript新运算符,javascript,Javascript,下面是一个最简单的函数: module.exports = function Dummy(id) { this.id = id; this.delay = function() { return new Promise(function (resolve, reject) { // Do some stuff async // once done resolve(); });

下面是一个最简单的函数:

module.exports = function Dummy(id) {
    this.id = id;

    this.delay = function() {
        return new Promise(function (resolve, reject) {
            // Do some stuff async
            // once done
            resolve();
        });
    }
}
我想在for循环中实例化这个
Dummy()
类的几个实例:

for (var i = 0; i < 3; i++) {
    var id = "id_" + i;
    var dummy = new Dummy(id);

    dummy
        .delay()
        .then(function () {
            console.log(dummy.id);
        });
}
for(变量i=0;i<3;i++){
var id=“id”+i;
var虚拟=新虚拟(id);
笨蛋
.delay()
.然后(函数(){
console.log(dummy.id);
});
}
但是,所有这些都打印了id_2;就好像即时
dummy
被覆盖一样,即使我每次都在
for
循环中实例化变量
var dummy


非常感谢您的帮助。

then函数中名为dummy的变量存在闭包问题。该值将是最后一次迭代,因为for的每次迭代都将覆盖上一次迭代。这意味着,当then函数异步执行时(由于您使用的承诺),虚拟变量的值将是循环期间分配的最后一个值

要解决此问题,我建议只需执行以下操作:

for (var i = 0; i < 3; i++) {
    (function (id) { //Creates a simple new scope
        var dummy = new Dummy(id);

        dummy
            .delay()
            .then(function () {
                console.log(dummy.id);
            });
    })("id_" + i);
}
for(变量i=0;i<3;i++){
(函数(id){//创建一个简单的新作用域
var虚拟=新虚拟(id);
笨蛋
.delay()
.然后(函数(){
console.log(dummy.id);
});
})(“id_u”+i);
}
有很多方法可以解决这个问题,但我认为这对于您当前的代码来说是最简单的


正如您可能注意到的,对于每个for迭代,我都创建了一个新的范围。执行then函数时,它将访问该范围内的虚拟变量。

这是因为当
console.log
发生时,虚拟变量是
id\u 2

.then(function () {
  console.log(dummy.id);
});

承诺将在执行for循环后排队并解析。一旦promise解决了
dummy
是最后一次迭代的值。

你需要喜欢javascript,如果有闭包问题,只需添加另一个函数即可。值将不是最后一个,而是“当前”。您的意思是什么?你在抱怨我的解决方案吗?正如我所说,有很多方法可以解决这个问题。实际上,我通常没有,因为我的架构避免了这种问题。JavaScript中的作用域只是一个很棒的特性,但它不是唯一的。是的。我喜欢javascript:)承认这一点没问题:)我没有抱怨,也给了你一票;P