【发布时间】:2021-10-17 11:41:01
【问题描述】:
for (var i = 1; i <= 4; i++) {
(function (j) {
setTimeout(function () {
console.log(j);
}, j * 1000);
})(i);
}
在上面的代码中,我的理解是 for 循环的每次迭代,IIFE 执行前的时间都会增加,因为它将循环中的当前项乘以 1000;它将在执行前 1 秒、2 秒、3 秒和 4 秒。但是当我尝试在 Chrome 开发人员工具控制台中运行它时,打印 1、2、3 和 4 之间的时间似乎并没有增加。打印出来的 3 到 4 之间肯定不是 4 秒。
比较试试运行:
(function (j) {
setTimeout(function () {
console.log(j);
}, j * 1000);
})(4);
我错过了什么吗?
【问题讨论】:
-
setTimeout不会同步等待。这就是为什么延迟乘以索引的原因 — 否则所有回调将同时发生。 -
循环仅在几毫秒内完成,因此所有这些延迟都基于循环运行时几乎相同的开始时刻......现在 + 0,现在 +1 秒,现在 + 2 秒等....
标签: javascript