提问人:Vetrivelu Murugesan 提问时间:10/29/2023 更新时间:10/29/2023 访问量:32
Wierd behaviour int Javascript
Wierd behaviour int Javascript
问:
我一直在研究 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')"
- 但奇怪的是,如果在它们之间引入一些代码,比如.它按预期工作,
console.log("gap")
- 同时运行 wait2SecondsASync 单独运行,没有同步功能 counterpart 让它正常工作。
我不知道发生了什么,我无法确切地搜索并找到解决方案。
答:
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
省略分号如何导致奇怪的编码错误的一个典型例子。很久以前,我发现把所有的分号都放进去更容易,而不必担心这些奇怪的极端情况。
评论
;
[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))
;
;