javascript - JavaScript setTimeout 未按预期工作
问题描述
我有一个代码示例
for(var i = 0; i < 3; i++) {
setTimeout() {
console.log("i " + i)
}
}
这是将“3”打印到控制台三次。但是,我希望它在不使用 let 的情况下打印“0、1、2” 。
到目前为止,我已经尝试了以下 -
var funcs = [];
function createfunc(i) {
return function() {
console.log("i ", i)
}
}
for(var i = 0; i < 3; i++) {
setTimeout(() => {
funcs[i] = createfunc(i) // statement 1
}, 1000)
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
如果我按原样使用语句 1 而不将其放入 setTimeout 函数中,这将正常工作。但是,如果我使用 setTimeout 函数,则会引发错误。有人可以让我知道如何使用 setTimeout 函数将 0、1、2 打印到控制台吗?
解决方案
它是由于关闭而发生的,无论如何您都可以使用以下代码,然后您将获得所需的正确结果。
for(var i = 0; i < 3; i++) {
((i) => {
setTimeout(() => {
console.log("i " + i)
}, 0);
})(i);
}
推荐阅读
- visual-studio - 在 Visual Studio Pro 2017 中启动 Azure Function 时出错
- kotlin - 使用 webflux 进行上下文日志记录(标头中的关联 ID)
- android - 在 Xamarin.Android 中使用新的 Google Place API 创建自定义地点选择器
- rust - 宏扩展忽略标记 `let` 和任何后续
- c++ - Visual Studio Code C/C++ Extension 没有为编译器设置包含路径
- javascript - Rshiny 下载按钮,可从不同位置收集多个文件
- angular - PowerShell 脚本添加“--prod”参数来构建 Angular CLI 项目
- c++ - 当模板和宏不可用时,生成类型变体 C++ 代码的最简单方法是什么?
- html - 带有背景图像的响应式 div 不起作用
- php - WP URL - 修复不正确的 GET 参数