【发布时间】:2021-08-18 02:52:32
【问题描述】:
我有一个可以完美运行的函数,直到我将它放在一个 for 循环中——此时我在 Safari 中得到一个参考错误(找不到 i)。在 Chrome 和 Firefox 中,它只运行第一次迭代(即 i = 0)。怎么回事?
编辑:这里 for 循环的要点是在其中的函数(包括超时)完成时进行迭代。如果有人对如何做到这一点有其他建议,那就太好了。
没有for循环的函数:
let realScores = [40,7, 3, 2]
let scores = [0,0,0,0]
let i = 0
let counter = 0
function timer() {
setTimeout(() => {
scores[i]++
console.log(i, scores[i])
if (scores[i] < realScores[i]) {
timer()
}
}, 10)
}
timer()
还有 for 循环:
let realScores = [40,7, 3, 2]
let scores = [0,0,0,0]
for (let i = 0; i < scores.length; i++) {
let counter = 0
function timer() {
setTimeout(() => {
scores[i]++
console.log(i, scores[i])
if (scores[i] < realScores[i]) {
timer()
}
}, 10)
}
timer()
}
【问题讨论】:
-
您在循环体内定义了一个新的
let i = 0,它隐藏了循环定义中定义的i。即代码第 4 行中的i和代码第 9 行中的i是两个不同的变量。所以当然,在循环体内对i的任何引用都是0 -
Ups,这只是调整我的代码以在此处上传时出现的错误。现已更正。该问题在 Safari 中仍然存在。在其他浏览器中,它虽然不如预期的那样工作。我正在尝试让 for 循环在超时功能完成后进行迭代。
标签: javascript for-loop settimeout