首页 >web前端 >js教程 >为什么 JavaScript `for` 循环中嵌套的 `setTimeout` 打印不连续的值?

为什么 JavaScript `for` 循环中嵌套的 `setTimeout` 打印不连续的值?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-15 15:32:14853浏览

Why Does Nested `setTimeout` in a JavaScript `for` Loop Print Non-Consecutive Values?

理解问题:嵌套在 for 循环中的 setTimeout 中的非连续值打印

在 JavaScript 中,像 setTimeout 这样的异步函数会安排回调延迟后执行。当放置在循环中时,这可能会导致意外行为,其中回调访问的变量可能与循环的状态不同步。

示例:警告不正确的值

考虑提供的脚本:

for (var i = 1; i <= 2; i++) {
    setTimeout(function() { alert(i) }, 100);
}

此代码旨在连续警告值 1 和 2,而是输出 3 两次。原因在于 setTimeout 的异步特性,它创建了一个引用 i 当前值的回调。

在没有函数字符串的情况下传递 i

来解决这个问题为了确保连续的值打印,我们需要为每个 setTimeout 回调创建一个不同的 i 实例。这是一个解决方案:

function doSetTimeout(i) {
  setTimeout(function() {
    alert(i);
  }, 100);
}

for (var i = 1; i <= 2; ++i)
  doSetTimeout(i);

通过为每个回调创建一个显式函数并将 i 作为参数传递,我们为循环的每次迭代创建 i 的单独副本。这允许回调在执行时引用 i 的正确值,确保 1 和 2 的连续打印。

以上是为什么 JavaScript `for` 循环中嵌套的 `setTimeout` 打印不连续的值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn