Ich konnte diese 3 Regeln in den Spezifikationen nicht so gut verstehen - ich hoffe, dass ich etwas habe, das einfacheres Englisch ist - aber hier ist, was ich aus JavaScript entnommen habe: The Definitive Guide, 6th Edition, David Flanagan, O'Reilly, 2011:
Zitat:
JavaScript behandelt nicht jeden Zeilenumbruch als Semikolon: Normalerweise werden Zeilenumbrüche nur dann als Semikolon behandelt, wenn der Code ohne die Semikolons nicht geparst werden kann.
Ein weiteres Zitat: für den Code
var a
a
=
3 console.log(a)
JavaScript behandelt den zweiten Zeilenumbruch nicht als Semikolon, da es mit der Analyse der längeren Anweisung a = 3 fortfahren kann;
und:
zwei Ausnahmen von der allgemeinen Regel, dass JavaScript Zeilenumbrüche als Semikolons interpretiert, wenn es die zweite Zeile nicht als Fortsetzung der Anweisung in der ersten Zeile analysieren kann. Die erste Ausnahme betrifft die return-, break- und continue-Anweisungen
... Wenn ein Zeilenumbruch nach einem dieser Wörter erscheint ... wird JavaScript diesen Zeilenumbruch immer als Semikolon interpretieren.
... Die zweite Ausnahme betrifft die Operatoren ++ und ... Wenn Sie einen dieser Operatoren als Postfix-Operator verwenden wollen, müssen sie in derselben Zeile stehen wie der Ausdruck, auf den sie sich beziehen. Andernfalls wird der Zeilenumbruch wie ein Semikolon behandelt, und ++ oder -- werden als Präfix-Operatoren auf den folgenden Code angewendet. Betrachten Sie zum Beispiel diesen Code:
x
++
y
Sie wird geparst als x; ++y;
, nicht als x++; y
Ich denke, vereinfacht ausgedrückt, bedeutet dies:
Im Allgemeinen wird JavaScript es als Fortsetzung des Codes behandeln, solange es Sinn macht -- außer in 2 Fällen: (1) nach einigen Schlüsselwörtern wie return
, break
, continue
, und (2) wenn es sieht ++
ou --
in eine neue Zeile einfügen, dann wird die ;
am Ende der vorherigen Zeile.
Der Teil über "behandeln es als Fortsetzung des Codes, solange es Sinn macht" macht es das Gefühl, wie reguläre Ausdrücke gierig Matching.
Dies bedeutet, dass für return
mit einem Zeilenumbruch, fügt der JavaScript-Interpreter ein ;
(erneut zitiert: Wenn ein Zeilenumbruch nach einem dieser Wörter erscheint [wie return
] ... JavaScript wird diesen Zeilenumbruch immer als Semikolon interpretieren)
und aus diesem Grund ist das klassische Beispiel für
return
{
foo: 1
}
wird nicht wie erwartet funktionieren, weil der JavaScript-Interpreter es als behandelt:
return; // returning nothing
{
foo: 1
}
Es darf kein Zeilenumbruch unmittelbar nach der return
:
return {
foo: 1
}
damit es richtig funktioniert. Und Sie können eine ;
selbst, wenn Sie die Regel befolgen würden, eine ;
nach jeder Anweisung:
return {
foo: 1
};