3

可能重复:
循环内的 Javascript 闭包 - 简单的实际示例
在循环内调用 setTimeout 函数

在将其称为重复之前,我查看了互联网,每个人似乎都有不同的问题。如果有人可以帮助我解决这个问题,将不胜感激。

基本上,我拥有的是for嵌套在第三个循环中的两个循环。

for (a=0 ... a++) {
    for (b=0 ... b++) {
        setTimeout( ... + a + ..., 1000*b);
    }
    for (c=0 ... c++) {
        setTimeout( ... + a + ..., 1000*c);
    }
}

这是一些伪代码,只是为了避免垃圾,但基本上我想将a值传递给定时器触发的回调函数。问题来自于a正在递增的事实,因此当触发事件时,该函数具有最后一个值,a而不是它注册的那个值。

我可以把它想象成 C/C++ 中的引用或指针,这真的很烦人。有什么方法可以赋予它永久的价值?

4

1 回答 1

4

最简单形式的闭包可以解决问题:

for (a=0 ... a++) {
    (function(a){
       for (b=0 ... b++) {
           setTimeout( ... + a + ..., 1000*b);
       }
       for (c=0 ... c++) {
           setTimeout( ... + a + ..., 1000*c);
       }
    })(a);
}

考虑到 Pointys 的答案:永远不应该将字符串传递给setTimeout.

您可以使用 3 参数形式setTimeout并传递函数(或对函数的引用)、时间值和函数的参数:

for (a=0 ... a++) {
     for (b=0 ... b++) {
         setTimeout( function(x){ /*do stuff, using x */}, 1000*b, a);
     }
}

但是请注意,遗憾的是 3 参数形式在 Internet Explorer 中不起作用。

于 2012-07-23T18:48:34.887 回答