Kein Semikolon vor [] verursacht einen Fehler in Javascript?

7
%Vor%

Ich war heute sehr überrascht, als dieser Code verursachte

%Vor%

Offensichtlich funktioniert das automatische JavaScript-Semikolon-Einfügen von JavaScript hier nicht wie erwartet. Aber warum?

Ich weiß, dass Sie empfehlen könnten, ; überall zu verwenden, um so etwas zu vermeiden, aber die Frage ist nicht, ob es besser ist, ; zu verwenden oder nicht. Ich würde gerne wissen, was genau hier passiert?

    
exebook 21.05.2013, 07:53
quelle

4 Antworten

10

Wenn ich mir Gedanken über die Semikolon-Einfügung mache, denke ich darüber nach, wie die betreffenden Zeilen ohne Leerzeichen aussehen würden. In Ihrem Fall wäre das:

%Vor%

Hier sagen Sie der Javascript-Engine, dass sie console.log mit der Länge von [a,b] aufruft, und dann den Index [a,b] des Ergebnisses dieses Aufrufs.

console.log gibt eine Zeichenfolge zurück, sodass Ihr Code versucht, die Eigenschaft b dieser Zeichenfolge zu finden, die nicht definiert ist und der Aufruf von undefined.some() fehlschlägt.

Es ist interessant zu bemerken, dass str[a,b] in str[b] aufgelöst wird, wobei angenommen wird, dass str eine Zeichenkette ist. Wie Kamil bemerkt, ist a,b ein gültiger Javascript-Ausdruck und das Ergebnis dieses Ausdrucks ist einfach b .

    
Dan M 21.05.2013, 08:00
quelle
7

Im Allgemeinen könnte man sagen, dass implizite Semikolons leicht versagen können, wenn ein Array in einer neuen Zeile definiert wird, da ein Array, das in einer neuen Zeile definiert ist, als Eigenschaftszugriff auf den Wert des Ausdrucks in der vorherigen Zeile interpretiert wird .

Javascript berücksichtigt nur neue Zeilen, um das Ende einer Anweisung zu markieren, wenn nicht die Anweisung beendet, nachdem diese neue Zeile einen Syntaxfehler verursacht hat. Siehe Welche Regeln gelten für die automatische Semikolon-Einfügung von JavaScript (ASI )? und EcmaScript 5 Spezifikationen für die genauen Regeln. (Dank Rob W und Rampenlicht)

Was passiert, ist folgendes:

Der Code wird als

interpretiert %Vor%

d. alles als eine Aussage.

Parsen Sie jetzt die Aussage:

some wird für den Wert von console.log([a,b].length)[a,b]

aufgerufen

Der Wert von console.log([a,b].length)[a,b] wird berechnet, indem der zurückgegebene Wert von console.log([a,b].length) ( undefined ) verwendet wird und dann versucht wird, auf die Eigenschaft mit dem Namen des Werts von a,b zuzugreifen. a,b ergibt den Wert von b (versuchen Sie es in Ihrer Konsole). Es gibt keine Eigenschaft mit dem Wert b von undefined . Der resultierende Wert ist also auch undefined .

Es gibt keine Methode some auf undefined , daher der Fehler.

    
Myrne Stol 21.05.2013 08:01
quelle
5

JavaScript behandelt nicht jeden Zeilenumbruch als Semikolon. Es behandelt normalerweise Linie bricht als Semikolon nur ab, wenn der Code ohne Semikolon nicht analysiert werden kann. Grundsätzlich behandelt JavaScript einen Zeilenumbruch als Semikolon, wenn das nächste Zeichen, das kein Leerzeichen ist, nicht als Fortsetzung der aktuellen Anweisung interpretiert werden kann. JavaScript - The Definitive Guide: 6. Ausgabe . Abschnitt 2.4

Also, in Ihrem Fall interpretiert es die Zeile als etwas wie

%Vor%

Und das ist der Grund für einen Fehler. JavaScript versucht, Array-Zugriff auf die Ergebnisse von console.log([a,b].length) durchzuführen. Abhängig von der JavaScript-Engine und dem Rückgabewert von console.log können verschiedene Fehler auftreten.

    
Bhashit Parikh 21.05.2013 08:06
quelle
1

Wenn es sich um die letzte Anweisung der Funktion oder des Ablaufs handelt, können Sie ';' vermeiden. Es wird jedoch empfohlen, ';' am Ende jeder Anweisung anzugeben, um einen solchen Fehler zu vermeiden.

    
developer 21.05.2013 08:00
quelle

Tags und Links