for循环中的new Operator

Javascript new Operator inside a for loop

本文关键字:new Operator 循环 for      更新时间:2023-09-26

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

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被覆盖了,即使我每次在for循环中实例化变量var dummy

感谢帮助

then函数中名为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);
}

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

正如您可能注意到的,对于每个for迭代,我都创建了一个新的作用域。当then函数被执行时,它将访问该作用域中的dummy变量。

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

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

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