【发布时间】:2021-03-23 10:23:03
【问题描述】:
我正在编写一些也使用超时的递归 JavaScript 代码。目的是稍等片刻,执行一些代码,然后再次调用该函数:
function executeAIMoves(states, curStateIdx) {
console.log(curStateIdx)
if (gameOver()) {
endDemo();
} else {
demoTimeout = setTimeout(() => {
makeBetterAIMove(states[curStateIdx], states[curStateIdx+1]).then(bool => {
executeAIstates(states, curStateIdx+1);
}).catch(err => {
console.log(`error executing ai moves: ${err.message}`)
})
}, demoDelay);
}
}
我在我的目录中搜索了“curStateIdx”,它只出现在这个函数中。我从来没有用 let 或 const 来“声明”它,它只是参数的名称。第一次调用这个函数时,我传递了一个值 0,但它甚至没有传递给 console.log()。我在 SO 上看到的关于这个错误的大部分内容都是人们以奇怪的方式使用 let 或 const,但我很困惑,因为我认为我实际上根本没有声明这个变量。
注意事项:
- 我正在使用 http-server(我需要在
script.js的顶部添加一些东西,所以我遇到了 CORS 错误)。我的 HTML 中的标签是<script type="module" src="script.js" defer></script> - 即使我注释掉整个JS文件,控制台仍然显示错误;唯一能消除错误的是我从 HTML 中完全删除了 script 标签。
提前致谢!
【问题讨论】:
-
确切的错误信息是什么?
-
错误信息应该告诉你它发生在哪一行。
-
@Barmar 确切的错误消息是
Uncaught SyntaxError: Identifier 'curStateIdx' has already been declared。它发生在函数的第一行,无论控制台日志是否存在。 -
函数内部应该没有问题,即使你有相同的标识符。必须尝试在此函数中重命名它吗?或者当你在错误发生前停止执行时你会看到什么?
标签: javascript asynchronous recursion es6-promise