setTimeout 和 for
setTimeout 和 for
我的代码如下。
var main = function(){
for(var j=0; j<10; j++){
for(var i=0; i<10; i++){
setTimeout(function(){$('div').append(i*j);}, 1000*j);
};
};
};
$(document).ready(main);
index.html
我希望显示如下
(第一秒)00000000000
(第二秒)00000000000123456789
(第三秒)000000000001234567890246891012141618
......
但实际显示为
(第一秒)100100100100100100100100100100
(第二秒)100100100100100100100100100100100100100100100100100100100100
(第三秒)100100100100100100100100100100100100100100100100100100100100100100100100100100100100100
......
为什么?我应该怎么做?
在这段内容中,出现了一个问题:在使用for
循环时,调度了100个setTimeout()
调用,但在这个点上,i
和j
都指向for
循环的结束值,这也是在调用setTimeout()
回调时它们的值。如果想在setTimeout()
回调中使用i
和j
,就需要创建一个闭包来为每次循环唯一地捕获它们的值。
为了解决这个问题,有很多其他的答案提供了如何实现的细节。以下是其中一些答案的链接:
- Asynchronous Process inside a javascript for loop
- Why is the loop assigning a reference of the last index element to?
这些链接提供了关于如何使用闭包来解决setTimeout()
和for
循环的问题的详细信息。