饿啊,越来越懒了,整天都在接受快信息,思维都变得迟钝,注意力变得涣散了,在此贴立个Flag,从现在起努力学习JS,几天发个学习笔记,充实自己,励志成为社区mod大佬。

2025.10.27


25.11.1 setTimeout()

let delay = 1000;
for (let i = 0; i < 5; i++) { 
  setTimeout(()=> {
  console.log(This is message ${ i + 1} and delay is ${ delay });
  }, delay);
  delay += 1000;
}
  # 在这段代码中为什么输出的delay值都为6000?

原因

setTimeout 的回调函数并不会在 for 循环的每次迭代中立即执行。相反,它会在指定的延迟时间之后被放入事件队列中,等待执行。而 for 循环本身会非常快地执行完毕。这导致for循环完毕后delay=6000,所有结果都是6000了。

如何解决这个问题?

如果您希望每次输出的 delay 值是循环当时的值(1000, 2000, 3000, 4000, 5000),您需要为每次循环迭代创建一个独立的作用域,以“捕获”当时 delay 的值。最现代和简洁的方法是使用 let 来声明一个在循环内部的块级作用域变量。

let delay = 1000;
for (let i = 0; i < 5; i++) { 
  let currentDelay=delay; // 捕获当前delay的值 
  setTimeout(()=> {
  console.log(`This is message ${i + 1} and delay is ${currentDelay}`);
  }, delay);
  delay += 1000;
}