理解问题:嵌套在 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中文网其他相关文章!