我在循环中调用 setTimeout 中的函数时遇到问题。
传递给函数的参数是每次迭代循环中计算的最后一个值,请参见下面的示例。
for(var i=0; i<datesYM.length; ++i) {
console.log(datesYM[i]);
var dateYM = datesYM[i];
setTimeout(function() {
myDB.markMonthsValuesAsUpdated2(myDoctorId, dateYM)
}, Math.floor(Math.random()*5001));
}
myDB.markMonthsValuesAsUpdated2 = function(myDoctorId, dateYM) {
console.log(dateYM);
[...]
打印:
2012-01
2012-02
2012-03
2012-04
2012-05
2012-06
2012-072012-07
2012-07
2012-07
2012-07
2012-07
2012-07
2012-07
最佳答案
将主体包裹在它自己的自执行函数中以强制一个新的范围:
for(var i=0; i<datesYM.length; ++i) {
console.log(datesYM[i]);
var dateYM = datesYM[i];
(function(dateYM) {
setTimeout(function() {
myDB.markMonthsValuesAsUpdated2(myDoctorId, dateYM)
}, Math.floor(Math.random()*5001));
})(dateYM);
}
如果没有这个,循环中创建的每个函数都会关闭 dateYM
的相同实例,该实例在任何这些函数执行时具有最后一次迭代的值.由于 JavaScript 具有函数范围,包装函数在每次迭代时创建一个新的 dateYM
,因此传递给 setTimeout
的每个新函数都有其自己的实例。
关于Javascript:setTimeout 和引用中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8824370/