Nun, zuerst sollte ich wahrscheinlich fragen, ob dies browserabhängig ist.
Ich habe gelesen, dass, wenn ein ungültiges Token gefunden wird, der Codeabschnitt jedoch bis zu diesem ungültigen Token gültig ist, ein Semikolon vor dem Token eingefügt wird, wenn ihm ein Zeilenumbruch vorausgeht.
Das häufigste Beispiel für Fehler, die durch das Einfügen von Semikolons verursacht werden, ist:
return
_a+b;
..was dieser Regel nicht zu folgen scheint, da _a ein gültiges Token wäre.
Auf der anderen Seite funktioniert das Aufbrechen von Anrufketten wie erwartet:
$('#myButton')
.click(function(){alert("Hello!")});
Hat jemand eine ausführlichere Beschreibung der Regeln?
Antworten:
Zunächst sollten Sie wissen, welche Anweisungen von der automatischen Einfügung von Semikolons betroffen sind (der Kürze halber auch als ASI bezeichnet):
var
Aussagedo-while
Aussagecontinue
Aussagebreak
Aussagereturn
Aussagethrow
AussageDie konkreten Regeln von ASI sind in der Spezifikation §11.9.1 Regeln für das automatische Einfügen von Semikolons beschrieben
Drei Fälle werden beschrieben:
Wenn ein Token (
LineTerminator
oder}
) gefunden wird, das von der Grammatik nicht zugelassen wird, wird ein Semikolon davor eingefügt, wenn:LineTerminator
.}
zB :
verwandelt sich in
Das
NumericLiteral
1
erfüllt die erste Bedingung, das folgende Token ist ein Zeilenabschluss.Das
2
erfüllt die zweite Bedingung, das folgende Token ist}
.Wenn das Ende des Eingabestreams von Token erreicht ist und der Parser den Eingabe-Token-Stream nicht als einzelnes vollständiges Programm analysieren kann, wird am Ende des Eingabestreams automatisch ein Semikolon eingefügt.
zB :
verwandelt sich in:
Dieser Fall tritt auf, wenn ein Token durch eine Produktion der Grammatik zugelassen wird, die Produktion jedoch eine eingeschränkte Produktion ist. Vor dem eingeschränkten Token wird automatisch ein Semikolon eingefügt.
Eingeschränkte Produktionen:
Das klassische Beispiel mit
ReturnStatement
:verwandelt sich in
quelle
++c
aus Gründen der Übersichtlichkeit nicht nur die Einfügung nach zeigen ?Direkt aus der ECMA-262, fünfte Ausgabe der ECMAScript-Spezifikation :
quelle
Ich konnte diese 3 Regeln in den Spezifikationen nicht allzu gut verstehen - ich hoffe, etwas zu haben, das klarer Englisch ist -, aber hier ist, was ich aus JavaScript zusammengetragen habe: The Definitive Guide, 6. Ausgabe, David Flanagan, O'Reilly, 2011:
Zitat:
Noch ein Zitat: für den Code
und:
Ich denke, um es zu vereinfachen, bedeutet das:
In der Regel wird JavaScript behandelt es als Fortsetzung des Codes solange es Sinn macht - außer zwei Fälle: (1) , nachdem einige Schlüsselwörter wie
return
,break
,continue
und (2) , wenn sie sieht ,++
oder--
auf eine neue Zeile, dann wird es hinzufügen das;
am Ende der vorherigen Zeile.Der Teil über "Behandle es als Fortsetzung des Codes, solange es Sinn macht" lässt es sich wie das gierige Matching des regulären Ausdrucks anfühlen.
Mit dem oben Gesagten bedeutet dies, dass
return
der JavaScript-Interpreter bei einem Zeilenumbruch ein einfügt;
(Nochmals zitiert: Wenn nach einem dieser Wörter ein Zeilenumbruch angezeigt wird [z. B.
return
] ... JavaScript interpretiert diesen Zeilenumbruch immer als Semikolon.)und aus diesem Grund das klassische Beispiel von
funktioniert nicht wie erwartet, da der JavaScript-Interpreter dies wie folgt behandelt:
Unmittelbar nach dem
return
: darf kein Zeilenumbruch auftreten.damit es richtig funktioniert. Und Sie können ein
;
selbst einfügen, wenn Sie die Regel befolgen, nach einer;
beliebigen Anweisung ein zu verwenden:quelle
Achten Sie beim Einfügen von Semikolons und der Anweisung var darauf, das Komma zu vergessen, wenn Sie var verwenden, aber mehrere Zeilen umfassen. Jemand hat das gestern in meinem Code gefunden:
Es wurde ausgeführt, aber der Effekt war, dass die srcIds-Deklaration / Zuweisung global war, da die lokale Deklaration mit var in der vorherigen Zeile nicht mehr angewendet wurde, da diese Anweisung aufgrund der automatischen Einfügung von Semikolons als beendet angesehen wurde.
quelle
var srcRecords = src.records srcIds = [];
in einer Zeile und vergessen Sie das Komma oder Sie schreiben "return a && b" und vergessen nichts ... aber der Zeilenumbruch vor dem a würde nach der Rückkehr ein automatisches Semikolon einfügen, was durch die ASI-Regeln definiert ist ...var
(let
,const
) in jeder Zeile überwiegt den Bruchteil einer Sekunde , die für die Eingabe benötigt wird.Die kontextuellste Beschreibung der automatischen Semikolon-Einfügung von JavaScript, die ich gefunden habe, stammt aus einem Buch über das Herstellen von Dolmetschern .
Er beschreibt es so, als würden Sie den Geruch codieren .
quelle
Nur um hinzuzufügen,
siehe dies unter Verwendung des sofort aufgerufenen Funktionsausdrucks (IIFE)
quelle