Javascript 无法读取属性';forEach&x27;未定义的

Javascript 无法读取属性';forEach&x27;未定义的,javascript,Javascript,为什么会产生下面的错误 var funcs = [] [1, 2].forEach( (i) => funcs.push( () => i ) ) TypeError:无法读取未定义的属性“forEach” 反对。 但是,如果分号被添加到第一行的末尾。保留分号,以便funcs的变量声明不包括您实例化为属于该变量的匿名数组,并且,如果您只是尝试将数组的所有元素推入“funcs”,则它应该如下所示: TypeError: Cannot read property 'forEach'

为什么会产生下面的错误

var funcs = []
[1, 2].forEach( (i) => funcs.push( () => i  ) )
TypeError:无法读取未定义的属性“forEach”
反对。

但是,如果分号
被添加到第一行的末尾。

保留分号,以便funcs的变量声明不包括您实例化为属于该变量的匿名数组,并且,如果您只是尝试将数组的所有元素推入“funcs”,则它应该如下所示:

TypeError: Cannot read property 'forEach' of undefined
    at Object.<anonymous>

第一行末尾没有分号。因此,这两行一起运行,并被解释为将
funcs的值设置为

[1, 2].forEach( (i) => funcs.push(i) )
表达式
1,2
变成了
2
(),因此您试图访问空数组的索引2:

[][1, 2].forEach( (i) => funcs.push( () => i  ) )

undefined
没有
forEach
方法。要解决此问题,请始终确保在行尾添加分号(如果不添加分号,请确保您知道自己在做什么)。

此问题的另一个解决方案是避免使用匿名数组。不需要分号

var funcs=[]
var arr=[1,2]

arr.forEach((i)=>funcs.push(()=>i))
您应该在行中添加分号。代码被视为
var funcs=[][1,2]。forEach…
您可以在单行
var funcs=[1,2]处使用
.map()
而不是
.forEach()
。map((i)=>()=>i)避免分号问题“表达式1,2变为2”,你能详细说明一下吗?@naveen当JavaScript看到像
a,b,c
这样的表达式时,它会按顺序计算所有子表达式,
a
,然后
b
,然后
c
,然后返回最后一个子表达式的值(
c
)。例如,当前面的表达式仅用于在只允许表达式的情况下产生的副作用时,如
for
循环的第一行,这是一个很有用的例子。这就是为什么要使用分号的经典示例,虽然在很多情况下不需要它们,但更好的示例是在定义多行对象文字后调用数组文字上的方法。在这种情况下,需要非常敏锐的眼睛才能发现在使用大括号进行块范围界定后不需要分号的情况。即使在广泛使用分号的项目中,在块作用域之后分号的使用频率有多高?我认为从使用的变量名可以清楚地看出,将数字转换为返回数字的函数是非常有意的。如果不是这样,显而易见的解决方案就是
var funcs=[1,2]
[][2] // undefined