在打电话给副本之前,我在网上看了一下,每个人似乎都有不同的问题。如果有人能帮我解决这个问题,我们将不胜感激。可能重复:
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 ++中的引用或指针,这真的很烦人。有什么方法可以赋予它永久的价值吗?
答案 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中不起作用。