我试图编写一个简单的函数来打印乘法表,并提出以下解决方案:
const oneToTwelveMultiplicationTable = () => {
[...Array(12).keys()].forEach((num1, i) => {
[...Array(12).keys()].forEach((num2, j) => {
console.log((num1 + 1) * (num2 + 1))
})
})
}
oneToTwelveMultiplicationTable()
它工作正常,这不是问题,问题在于,当我试图清理响应的格式(我想要一种更像表格的格式)时,我进行了以下编辑:
const oneToTwelveMultiplicationTable = () => {
let result = []
[...Array(12).keys()].forEach((num1, i) => {
[...Array(12).keys()].forEach((num2, j) => {
console.log((num1 + 1) * (num2 + 1))
})
})
}
oneToTwelveMultiplicationTable()
这在第四行给出了一个错误,我可以通过在其前面添加一个返回值来解决该错误:
const oneToTwelveMultiplicationTable = () => {
let result = []
return [...Array(12).keys()].forEach((num1, i) => {
[...Array(12).keys()].forEach((num2, j) => {
console.log((num1 + 1) * (num2 + 1))
})
})
}
oneToTwelveMultiplicationTable()
我的问题是为什么我需要那份退货?我不是想让函数返回值,为什么在forEach前面添加return可以修复错误,以及为什么首先添加变量声明会导致错误呢?这应该很简单,但是我不清楚为什么会发生这种情况。
答案 0 :(得分:4)
问题是自动分号或 ASI 。这是javascript的“功能”,它允许分号是可选的,但有时确实只是为您插入了分号。这通常可以正常工作,但是当一行以[
或(
开头时,在前一行的末尾 not 不能插入分号。
这两个表达式:
let result = []
[...Array(12).keys()]
被解释为一个表达式:
let result = [][...Array(12).keys()]
实际上根本不起作用。
return
起作用的原因是,它阻止了行以[
开头,因此解释器为您在前一行的末尾添加了分号。
要解决此问题,您可以使用分号:
let result = [];
[...Array(12).keys()]
或者,使用简单的for循环来回避问题
for (num1 = 0; num1 < 12; num1++) {
for (num2 = 0; num2 < 12; num2++) {
//...
}
}