2016-08-12 239 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

相關問題