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:
JavaScript behandelt nicht jeden Zeilenumbruch als Semikolon: Zeilenumbrüche werden normalerweise nur dann als Semikolon behandelt, wenn der Code ohne die Semikolons nicht analysiert werden kann.
Noch ein Zitat: für den Code
var a
a
=
3 console.log(a)
JavaScript behandelt den zweiten Zeilenumbruch nicht als Semikolon, da die längere Anweisung a = 3 weiter analysiert werden kann.
und:
Zwei Ausnahmen von der allgemeinen Regel, dass JavaScript Zeilenumbrüche als Semikolons interpretiert, wenn die zweite Zeile nicht als Fortsetzung der Anweisung in der ersten Zeile analysiert werden kann. Die erste Ausnahme betrifft die Anweisungen return, break und continue
... Wenn nach einem dieser Wörter ein Zeilenumbruch angezeigt wird ... JavaScript interpretiert diesen Zeilenumbruch immer als Semikolon.
... Die zweite Ausnahme betrifft die Operatoren ++ und −−. Wenn Sie einen dieser Operatoren als Postfix-Operatoren verwenden möchten, müssen sie in derselben Zeile wie der Ausdruck stehen, auf den sie angewendet werden. Andernfalls wird der Zeilenumbruch als Semikolon behandelt und ++ oder - als Präfixoperator analysiert, der auf den folgenden Code angewendet wird. Betrachten Sie diesen Code zum Beispiel:
x
++
y
Es wird als x; ++y;
, nicht als analysiertx++; y
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
return
{
foo: 1
}
funktioniert nicht wie erwartet, da der JavaScript-Interpreter dies wie folgt behandelt:
return; // returning nothing
{
foo: 1
}
Unmittelbar nach dem return
: darf kein Zeilenumbruch auftreten.
return {
foo: 1
}
damit es richtig funktioniert. Und Sie können ein ;
selbst einfügen, wenn Sie die Regel befolgen, nach einer ;
beliebigen Anweisung ein zu verwenden:
return {
foo: 1
};