Non riuscivo a capire troppo bene quelle 3 regole nelle specifiche - spero di avere qualcosa che sia un inglese più semplice - ma ecco cosa ho raccolto da JavaScript: The Definitive Guide, 6th Edition, David Flanagan, O'Reilly, 2011:
Citazione:
JavaScript non considera ogni interruzione di riga come un punto e virgola: in genere considera le interruzioni di riga come punti e virgola solo se non è in grado di analizzare il codice senza i punti e virgola.
Un'altra citazione: per il codice
var a
a
=
3 console.log(a)
JavaScript non considera la seconda riga come un punto e virgola perché può continuare ad analizzare l'istruzione più lunga a = 3;
e:
due eccezioni alla regola generale che JavaScript interpreta le interruzioni di riga come punti e virgola quando non è in grado di analizzare la seconda riga come continuazione dell'istruzione sulla prima riga. La prima eccezione riguarda le dichiarazioni return, break e continue
... Se appare un'interruzione di riga dopo una di queste parole ... JavaScript interpreterà sempre l'interruzione di linea come punto e virgola.
... La seconda eccezione riguarda gli operatori ++ e −− ... Se si desidera utilizzare uno di questi operatori come operatori postfix, devono apparire sulla stessa riga dell'espressione a cui si applicano. In caso contrario, l'interruzione di riga verrà trattata come punto e virgola e ++ o - verranno analizzati come operatore prefisso applicato al codice che segue. Considera questo codice, ad esempio:
x
++
y
Viene analizzato come x; ++y;
, non comex++; y
Quindi penso di semplificarlo, ciò significa:
In generale, JavaScript tratterà come continuazione del codice finché ha senso - ad eccezione di 2 casi: (1), dopo alcune parole chiave come return
, break
, continue
, e (2) se vede ++
o --
su una nuova linea, poi si aggiunge la ;
fine della riga precedente.
La parte su "trattalo come una continuazione del codice fintanto che ha senso" lo fa sentire come la corrispondenza avida dell'espressione regolare.
Detto questo, ciò significa che return
con un'interruzione di riga, l'interprete JavaScript inserirà a;
(citato di nuovo: se appare un'interruzione di riga dopo una di queste parole [come return
] ... JavaScript interpreterà sempre quell'interruzione di linea come punto e virgola)
e per questo motivo, il classico esempio di
return
{
foo: 1
}
non funzionerà come previsto, perché l'interprete JavaScript lo tratterà come:
return; // returning nothing
{
foo: 1
}
Non ci deve essere alcuna interruzione di linea immediatamente dopo return
:
return {
foo: 1
}
affinché funzioni correttamente. E puoi inserire un ;
te stesso se dovessi seguire la regola di utilizzare una ;
dopo qualsiasi istruzione:
return {
foo: 1
};