【问题标题】:Uncaught SyntaxError: Identifier '[x]' has already been declared - why?Uncaught SyntaxError: Identifier '[x]' has been declared - 为什么?
【发布时间】: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 上看到的关于这个错误的大部分内容都是人们以奇怪的方式使用 letconst,但我很困惑,因为我认为我实际上根本没有声明这个变量。

注意事项:

  1. 我正在使用 http-server(我需要在 script.js 的顶部添加一些东西,所以我遇到了 CORS 错误)。我的 HTML 中的标签是 <script type="module" src="script.js" defer></script>
  2. 即使我注释掉整个JS文件,控制台仍然显示错误;唯一能消除错误的是我从 HTML 中完全删除了 script 标签。

提前致谢!

【问题讨论】:

  • 确切的错误信息是什么?
  • 错误信息应该告诉你它发生在哪一行。
  • @Barmar 确切的错误消息是 Uncaught SyntaxError: Identifier 'curStateIdx' has already been declared。它发生在函数的第一行,无论控制台日志是否存在。
  • 函数内部应该没有问题,即使你有相同的标识符。必须尝试在此函数中重命名它吗?或者当你在错误发生前停止执行时你会看到什么?

标签: javascript asynchronous recursion es6-promise


【解决方案1】:

如果变量是用 let 或 const 以某种方式声明的,将转到“curStateIdx”的参数应该是 var。在我的情况下,我改为 var 。

【讨论】:

  • 你是对的人,你的解决方案拯救了我的位置
  • @ArsalanAhmadIshaq 不客气!乐于助人:)
猜你喜欢
  • 2018-09-21
  • 2019-07-23
  • 2020-12-27
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多