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

なぜ以下のエラーが発生しますか?未定義の 'forEach'プロパティを読み取ることができません

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

セミコロン;は、最初の行の末尾に追加された場合は、エラーが表示されなくなります。

+2

セミコロンを行に追加する必要があります。コードは 'var funcs = [] [1、2] .forEach ...'と見なされました – epascarello

+1

'.forEach()'の代わりに '.map()'を 'var funcs = [1 、2] .map((i)=>()=> i) 'セミコロンの問題を避けるために – guest271314

答えて

11

最初の行の最後にセミコロンはありません。だから、2行は一緒に実行し、それが

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

式にfuncsの値を設定すると解釈されますが、空の配列のインデックス2にアクセスしようとしているので1, 2、ちょうど2comma operator)は以下のようになる。

[][2] // undefined 

undefinedには、forEachの方法がありません。この問題を解決するには、行末に必ずセミコロンを置いてください(そうでない場合は、自分が行っていることを知っていることを確認してください)。

+0

"式1,2はちょうど2になります。ちょっと精巧にできますか? – naveen

+1

@naveen JavaScriptは 'a、b、c 'のような式を見ると、すべての部分式を順番に評価し、次に' b'、次に 'c'を順番に評価し、最後のサブ式の値を返します-expression( 'c')。これは有用である。以前の式が、 'for'ループの最初の行のように、式だけが許されている状況で副作用のために使用されているときです。 – rvighne

+2

セミコロンを使用する必要がある理由の古典的な例ですが、必要がない場合が多くあります。 – jfriend00

0

funcsの変数宣言に変数に属するものとしてインスタンス化する匿名配列が含まれないように、また配列のすべての要素を単に 'funcs'にプッシュしようとしている場合は、次のようになります。

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

数値を返す関数に数値を変換することはかなり意図的であるということは、変数名から明らかです。そうでなかったら、明白な解決策は単に 'var funcs = [1,2];' – HonoredMule

関連する問題