Wierd behaviour int Javascript

Wierd behaviour int Javascript

提问人:Vetrivelu Murugesan 提问时间:10/29/2023 更新时间:10/29/2023 访问量:32

问:

我一直在研究 JS 并尝试异步行为。我编写了以下代码。

console.log("Program started");
[1, 2, 3, 4].forEach((val) => wait2SecondsSync(val))
// console.log("gap");
[1, 2, 3, 4].forEach((val) => wait2SecondsASync(val))

function wait2SecondsSync(val) {
    const date = Date.now() + 2000;
    while (date > Date.now()) { }
    console.log(val);
}

function wait2SecondsASync(val) {
    setTimeout(() => { console.log(val) }, 2000)
}

现在,我在打印 1 2 3 4 后出现错误。"TypeError: Cannot read properties of undefined (reading '4')"

  1. 但奇怪的是,如果在它们之间引入一些代码,比如.它按预期工作,console.log("gap")
  2. 同时运行 wait2SecondsASync 单独运行,没有同步功能 counterpart 让它正常工作。

我不知道发生了什么,我无法确切地搜索并找到解决方案。

JavaScript的 node.js 异步

评论

4赞 Jaromanda X 10/29/2023
你错过了一个 - 不是你想做的...... 让它变得更好 - 在 JavaScript 中,尽管在许多地方不是“必需的”,但最好在有意义的地方使用它们 - 注意:注释不会改变任何关于缺少;[1, 2, 3, 4].forEach((val) => wait2SecondsSync(val))[1, 2, 3, 4].forEach((val) => wait2SecondsASync(val))[1, 2, 3, 4].forEach((val) => wait2SecondsSync(val));[1, 2, 3, 4].forEach((val) => wait2SecondsASync(val));;
0赞 Vetrivelu Murugesan 10/29/2023
@JaromandaX,谢谢。

答:

1赞 Evert 10/29/2023 #1

要扩展 Jaromanda X,请了解更多细节:

[1, 2, 3, 4].forEach((val) => wait2SecondsSync(val))
[1, 2, 3, 4].forEach((val) => wait2SecondsASync(val))

这些行被解释为 1 个语句。因此,第一个 ,(返回)undefined 的结果随后被访问,就好像它是使用第二个 [1,2,3,4]' 的数组一样。forEach

所以这失败了,因为第一个语句大致是

[1, 2, 3, 4].forEach((val) => wait2SecondsSync(val))[1, 2, 3, 4].forEach((val) => wait2SecondsASync(val))

那么为什么它会失败呢?这是因为访问数组时,会遇到这样的情况:4

myArray[1,2,3,4].someThing

可能看起来很奇怪,但首先经过评估并使用逗号运算符1,2,3,4

此运算符计算列表中的所有内容,并最终返回最后一项。所以这相当于:

myArray[4].someThing

评论

0赞 jfriend00 10/29/2023
省略分号如何导致奇怪的编码错误的一个典型例子。很久以前,我发现把所有的分号都放进去更容易,而不必担心这些奇怪的极端情况。