for循环中的Javascript new运算符

时间:2015-08-02 22:47:41

标签: 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();
        });
    }
}

我想在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);
        });
}

但是,所有这些都打印id_2;就好像即时dummy被覆盖一样,即使我每次都在var dummy循环内实例化变量for

非常感谢帮助。

2 个答案:

答案 0 :(得分:3)

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

为了解决这个问题,我建议改为:

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);
}

有很多方法可以解决这个问题,但我认为这对您当前的代码来说是最简单的。

您可能已经注意到,对于每次迭代,我都创建了一个新范围。当执行 then function 时,它将访问该范围内的 dummy var。

答案 1 :(得分:0)

这是因为当console.log发生时,虚拟是id_2

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

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