Javascript setTimeout未按预期工作

Javascript setTimeout未按预期工作,javascript,Javascript,我正在用Javascript编写一个for循环。理想的目标是打印出0、1、2,中间有3秒的间隔 for (var i=0; i<3; i++) { console.log(i); } for(var i=0;i在setTimeout调用运行之前完成循环是完全正确的。由于所有超时函数都引用i,它们都将打印出3。解决这一问题的方法是在闭包中捕获i的值 for (var i = 0; i < 3; i++) { (function(index) { setTimeou

我正在用Javascript编写一个for循环。理想的目标是打印出0、1、2,中间有3秒的间隔

for (var i=0; i<3; i++) {
    console.log(i);
}

for(var i=0;i在
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
}
for(变量i=0;i<3;i++){
(功能(索引){
setTimeout(函数(){
控制台日志(索引);
},3000*指数);
})(i) ;//立即调用函数并传递i的值
}

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
}
for(变量i=0;i<3;i++){
(功能(索引){
setTimeout(函数(){
控制台日志(索引);
},3000*指数);
})(i) ;//立即调用函数并传递i的值
}

搜索JavaScript闭包。循环没有等待
超时
运行,因此当它运行时,循环已经完成,
i
是3。您不需要循环,只需要
var i=0;setTimeout(function(){console.log(i);i++;},3000*i)
搜索JavaScript闭包。循环没有等待
超时
运行,因此当它运行时,循环已经完成,
i
是3。您不需要循环,只需要
var i=0;setTimeout(function(){console.log(i);i++;},3000*i);
或者您可以使用
.bind()
method->@JoshCrozier这肯定也行。我是Javascript新手,有一个后续问题。上下文是我有一个要单击的URL列表(但不是同时单击所有URL,因此暂停)。我如何设置
index
以及
立即调用函数并传递I
的值是什么意思?这部分对我来说没有意义。顺便说一句,这是可行的,但我不明白
index
是如何设置为
I
的值的,以及
(I)
正在做什么:-)
(I)
是“立即调用的函数表达式”,这意味着您正在使用参数
i
调用
(函数(索引){….}
。然后索引(i)的值将保留在传递给setTimeout的函数的本地范围内,即闭包。或者您可以使用
.bind()
method->@JoshCrozier这肯定也行。我是Javascript新手,有一个后续问题。上下文是我有一个要单击的URL列表(但不是同时单击所有URL,因此暂停)。我如何设置
index
以及
立即调用函数并传递I
的值是什么意思?这部分对我来说没有意义。顺便说一句,这是可行的,但我不明白
index
是如何设置为
I
的值的,以及
(I)
正在做什么:-)
(I)
是立即调用函数表达式”,这意味着您正在使用参数
i
调用
(函数(索引){…}
。然后,索引(i)的值将保留在传递给setTimeout(闭包)的函数的局部范围内。