循环内setTimeout中的变量(范围问题)

时间:2012-07-23 18:45:01

标签: javascript jquery

  

可能重复:
  Javascript closure inside loops - simple practical example
  Calling setTimeout function within a loop

在打电话给副本之前,我在网上看了一下,每个人似乎都有不同的问题。如果有人能帮我解决这个问题,我们将不胜感激。

基本上,我所拥有的是嵌套在第三个中的两个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 ++中的引用或指针,这真的很烦人。有什么方法可以赋予它永久的价值吗?

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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