2016-08-12 155 views
1
var funcs = [] 
[1, 2].forEach((i) => funcs.push(() => i )) 

为什么会产生下面的错误?无法读取属性'forEach'的undefined

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

然而,错误消失如果分号;被添加到第一行的末尾。

+2

您应该将分号添加到您的行中。代码被认为是'var funcs = [] [1,2] .forEach ...' – epascarello

+1

你可以使用'.map()'而不是'.forEach()'在单行'var funcs = [1 ,2] .map((i)=>()=> i)'为了避免问题,用分号 – guest271314

回答

11

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

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

表达1, 2就像变成2comma operator),所以你试图访问一个空数组的索引2:

[][2] // undefined 

undefined没有forEach方法。要解决这个问题,一定要确保你在行尾加分号(或者如果你不行,确保你知道你在做什么)。

+0

“表达式1,2变成2”,你能详细说明一下吗? – naveen

+1

@naveen当JavaScript看到类似'a,b,c'的表达式时,它按顺序评估所有子表达式,然后是'a',然后是'b',然后是'c',然后返回最后一个子表达式的值表达('c')。这很有用,例如当以前的表达式仅用于在只允许表达式的情况下的副作用时,如“for”循环的第一行。 – rvighne

+2

为什么要使用分号这样一个经典的例子,虽然有很多情况下他们不需要。 – jfriend00

0

保留分号以便funcs的变量声明不包含您实例化为属于该变量的匿名数组,并且如果您只是试图将数组的所有元素都推送到“funcs”中,那么它应该看起来像:

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

我认为从变量名中可以清楚地看出,将数字转换为返回数字的函数是非常有意的。如果不是这种情况,显而易见的解决方案就是'var funcs = [1,2];' – HonoredMule