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

Warum erzeugt es den Fehler unten?Kann die Eigenschaft 'forEach' von undefined nicht lesen

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

Allerdings geht der Fehler weg, wenn das Semikolon ; bis zum Ende der ersten Zeile hinzugefügt wird.

+2

Sie sollten das Semikolon zu Ihren Zeilen hinzufügen. Der Code wird als 'var funcs = [] [1, 2] .forEach ...' – epascarello

+1

angesehen. Sie könnten '.map()' anstelle von '.forEach()' in einer einzelnen Zeile 'var funcs = [1 verwenden , 2] .map ((i) =>() => i) 'um Probleme mit Semikolon zu vermeiden – guest271314

Antwort

11

Es gibt kein Semikolon am Ende der ersten Zeile. So sind die beiden Linien zusammenlaufen, und es wird als Einstellung den Wert von funcs zu

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

interpretiert Der Ausdruck 1, 2 wird nur 2 (comma operator), so Sie versuchen, Index für den Zugriff auf 2 eines leeren Array:

[][2] // undefined 

Und undefined hat keine forEach Methode. Um dies zu beheben, stellen Sie immer ein Semikolon am Ende Ihrer Zeilen (oder wenn Sie nicht tun, stellen Sie sicher, dass Sie wissen, was Sie tun).

+0

"Der Ausdruck 1, 2 wird nur 2", können Sie ein wenig weiter ausführen? – naveen

+1

@naveen Wenn JavaScript einen Ausdruck wie 'a, b, c' sieht, wertet es alle Unterausdrücke in der Reihenfolge 'a', dann 'b', dann 'c' aus und gibt dann den Wert der letzten Untermenge zurück -Ausdruck ('c'). Dies ist z.B. wenn die vorherigen Ausdrücke nur für ihre Nebenwirkungen in einer Situation verwendet werden, in der nur Ausdrücke erlaubt sind, wie die erste Zeile einer For-Schleife. – rvighne

+2

Solch ein klassisches Beispiel dafür, warum Semikolons verwendet werden sollten, obwohl es viele Fälle gibt, in denen sie nicht benötigt werden. – jfriend00

0

Behalten Sie das Semikolon, so dass die Variablendeklaration von funcs das anonyme Array, das Sie instanziieren, nicht zu der Variablen gehören, und wenn Sie nur versuchen, alle Elemente des Arrays in 'funcs' zu schieben sollte wie folgt aussehen:

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

Ich denke es ist ziemlich klar aus dem verwendeten Variablennamen, dass die Umwandlung von Zahlen in Funktionen, die Zahlen zurückgeben, ziemlich beabsichtigt ist. Wäre das nicht der Fall, wäre die naheliegende Lösung einfach "var funcs = [1, 2];" – HonoredMule

Verwandte Themen