Javascript:setTimeout 和引用中的函数

标签 javascript parameters settimeout

我在循环中调用 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-07

2012-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/

相关文章:

javascript - 将 PHP 正则表达式转换为 Javascript

javascript - 如何检测用户是否切换了浏览器选项卡?

javascript - 有没有办法在js中将特定参数传递给函数(无顺序)?

python - 第一个未命名参数可选

c++ - 将 Functor 转换为 Object of Type 函数

javascript - 谷歌地图 zoomOut-Pan-zoomIn 动画

javascript - 如何使用纯html、js、jquery搭建多语言网站?

javascript - 双名方法会产生副作用吗?

javascript - JQuery:无法访问修改的元素

javascript - 对 setTimeout 中的第一个参数感到困惑