for循环中的new Operator
Javascript new Operator inside a for loop
下面是一个最简单的函数:
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
就是上次迭代的值。
相关文章:
- 使用:new Image()控制加载html.src=html_URL
- 如何在不使用 new 关键字的情况下从函数创建对象
- 为什么要做新的.Date()与new相差1小时.日期().到ISOString()
- “createImageData()”和“new ImageData(()”有何不同
- 返回值+new Date()与Date.now()是否不同
- new SharedWorker(“whatever.js”)返回一个错误
- new Datamap() 在调用之间保持内存的共享状态
- new XMLHttpRequest().responseType empty
- a=1和a=new Number()之间的差异
- JavaScript“new Date()”使用哪个时区
- JS new.target vs. instanceof
- 为什么(new RegExp(“w”)==/w/)在JS中为false
- JavaScript-使用B.prototype=new A()继承数组
- 为什么使用“new”创建一个Javascript数组被认为是不好的
- “new”关键字是在构造对象时自动设置“constructor”属性的唯一方法吗
- typeof new Function()总是“;函数”;
- MongoDB MapReduce, Date and % operator
- 这行是什么意思“ operator.indexOf(btnVal) > -1”
- new Date('2011-12-15 00:00:00') is showing up as NaN
- for循环中的new Operator