For loop 具有setTimeOut意外输出的For循环

For loop 具有setTimeOut意外输出的For循环,for-loop,settimeout,For Loop,Settimeout,这是怎么回事?我不明白我们是怎么得到这个结果的 for (var i = 1; i <=4; i++) { (function(j) { setTimeout(function() { console.log(j); },j*1000); })(i) } (变量i=1;i)的 使用一个参数创建一个匿名函数,j,并通过传递值i立即调用它。这称为iLife,您可以在上阅读更多有关它的信息。因此,j是i的值,但它不会随着i的更改而更改 setTimeou

这是怎么回事?我不明白我们是怎么得到这个结果的

for (var i = 1; i <=4; i++) {
    (function(j) {
    setTimeout(function() {
    console.log(j);
    },j*1000);
    })(i)
}
(变量i=1;i)的

使用一个参数创建一个匿名函数,
j
,并通过传递值
i
立即调用它。这称为iLife,您可以在上阅读更多有关它的信息。因此,
j
i
的值,但它不会随着
i
的更改而更改

setTimeout(function() {
  ...
},j*1000);
设置特定毫秒数的超时,并在超时过期时执行该函数。请注意,
setTimeout
立即退出,它只安排稍后执行该函数。在JavaScript世界中,这称为异步执行

console.log(j);
在控制台上打印
1
2
3
4
。请记住,由于
setTimeout
,这将在
1
2
3
4
秒后发生


因此,
for
几乎是瞬时执行的,因为它所做的唯一工作是为将来调度四个函数。此执行的值为
undefined
,如果您在那里执行代码段,将打印到控制台。在代码段退出后1000毫秒,将触发第一个调度函数,然后打印其局部变量
j
(即
1
)的值。循环后2000ms(打印
1
后1秒),执行下一个预定函数,打印
2
。这种情况还会发生两次。

您应该解释为什么您认为输出是意外的,以及您希望我们能够帮助您的原因。此外,“第二个间隔”是什么意思?像这样,我们只能说,“是的,还有?”首先,setTimeOut是console.log(j)它在setTimeOut函数之外打印(i),我不明白这一点。
setTimeout(function() {
  ...
},j*1000);
console.log(j);