在 setTimeout
中使用循环时,需要注意 JavaScript 的事件循环机制。setTimeout
是异步的,这意味着它不会阻塞其他代码的执行。在 setTimeout
中使用循环时,可能会导致意外的结果。
例如,以下代码将会在 1 秒后输出数字 5 到 1,而不是按照预期的顺序输出数字 1 到 5。
for (var i = 5; i > 0; i--) {
setTimeout(function() {
console.log(i);
}, 1000);
}
这是因为 setTimeout
中的回调函数会在循环结束后执行,此时 i
的值已经变为 0。为了解决这个问题,可以使用立即执行函数表达式(IIFE)来创建一个新的作用域,以便在每次循环时捕获当前的 i
值。
for (var i = 5; i > 0; i--) {
(function(currentI) {
setTimeout(function() {
console.log(currentI);
}, 1000);
})(i);
}
这样,每次循环时都会创建一个新的作用域,并将当前的 i
值传递给 IIFE。因此,当 setTimeout
中的回调函数执行时,它将能够访问正确的 i
值。
领取专属 10元无门槛券
手把手带您无忧上云