JS 破坏性赋值 - 为什么它会这样工作?

JS destructive assignment - why does it work like this?

for (var i = 1; i < 5; i++) {
  console.log(i);
  setTimeout(function() {
    console.log(i);
  }, 3000)
};

首先,此代码显示从 1 到 4 的数字,三秒后 - 四五。这不是一个明显的行动顺序。 我想输出应该是这样的:

1 //pause 3s
1
2 //pause 3s
2
3 //pause 3s
3
4 //pause 3s
4

我需要了解有关 JS 解释器的哪些信息才能给出正确答案? 问题根本不是闭包

setTimeout 延迟函数调用,它不会让实际程序进入睡眠状态。这是一个异步方法,如果你想暂停你的应用程序 - 这样做:

for (var i = 1; i < 5; i++) {
  console.log(i);
  sleep(3000);
  console.log(i);
};

你可以用你的索引来控制setTimeout的时间:

for (var i = 0; i < 4; i++) {
  setTimeout(function(ii) {
    console.log(ii);
  }.bind(0, i+1), i*1000)
};