我正在用Javascript编写for循环。期望的目标是打印出0,1,2,中间有3秒的间隙。
for (var i=0; i<3; i++) {
console.log(i);
}
按预期打印所有内容,没有暂停。但是当我添加一个setTimeout时:
for (var i=0; i<3; i++) {
setTimeout(function() {console.log{i},3000*i}
}
结果是它打印出3
,3
,3
,间隔为3秒。暂停工作,但它看起来像是在正确的数字打印之前完成循环。
答案 0 :(得分:4)
在setTimeout
调用运行之前完成循环是完全正确的。由于所有超时功能都引用i
,因此它们都打印出3
。解决此问题的方法是在闭包中捕获i
的值。
for (var i = 0; i < 3; i++) {
(function(index) {
setTimeout(function() {
console.log(index);
}, 3000 * index);
})(i); // Instantly call the function and pass the value of i
}