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