饿啊,越来越懒了,整天都在接受快信息,思维都变得迟钝,注意力变得涣散了,在此贴立个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;
}
评论