JS函数显示错误但不返回,但不必返回

时间:2018-10-17 18:27:27

标签: javascript ecmascript-6

我试图编写一个简单的函数来打印乘法表,并提出以下解决方案:

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可以修复错误,以及为什么首先添加变量声明会导致错误呢?这应该很简单,但是我不清楚为什么会发生这种情况。

1 个答案:

答案 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++) {
    //...
  }
}