No podía entender muy bien esas 3 reglas en las especificaciones, espero tener algo que sea más simple en inglés, pero esto es lo que obtuve de JavaScript: The Definitive Guide, 6th Edition, David Flanagan, O'Reilly, 2011:
Citar:
JavaScript no trata cada salto de línea como un punto y coma: por lo general, trata los saltos de línea como punto y coma solo si no puede analizar el código sin los puntos y coma.
Otra cita: para el código
var a
a
=
3 console.log(a)
JavaScript no trata el segundo salto de línea como un punto y coma porque puede continuar analizando la declaración más larga a = 3;
y:
dos excepciones a la regla general de que JavaScript interpreta los saltos de línea como punto y coma cuando no puede analizar la segunda línea como una continuación de la declaración en la primera línea. La primera excepción implica las declaraciones de devolución, interrupción y continuación.
... Si aparece un salto de línea después de cualquiera de estas palabras ... JavaScript siempre interpretará ese salto de línea como un punto y coma.
... La segunda excepción involucra a los operadores ++ y −− ... Si desea utilizar cualquiera de estos operadores como operadores de postfix, deben aparecer en la misma línea que la expresión a la que se aplican. De lo contrario, el salto de línea se tratará como un punto y coma, y el ++ o - se analizará como un operador de prefijo aplicado al código que sigue. Considere este código, por ejemplo:
x
++
y
Se analiza como x; ++y;
, no comox++; y
Entonces creo que simplificarlo, eso significa:
En general, JavaScript lo tratará como continuación del código, siempre y cuando tenga sentido - excepto 2 casos: (1) Después de algunas palabras clave como return
, break
, continue
, y (2) si se ve ++
o --
en una nueva línea, entonces se añadirá el ;
al final de la línea anterior.
La parte sobre "tratarlo como una continuación del código siempre que tenga sentido" lo hace sentir como la codiciosa coincidencia de la expresión regular.
Dicho lo anterior, eso significa que return
con un salto de línea, el intérprete de JavaScript insertará un;
(citado nuevamente: si aparece un salto de línea después de cualquiera de estas palabras [como return
] ... JavaScript siempre interpretará ese salto de línea como un punto y coma)
y por esta razón, el ejemplo clásico de
return
{
foo: 1
}
no funcionará como se esperaba, porque el intérprete de JavaScript lo tratará como:
return; // returning nothing
{
foo: 1
}
No debe haber un salto de línea inmediatamente después de return
:
return {
foo: 1
}
para que funcione correctamente. Y puede insertar un ;
mensaje si sigue la regla de usar un ;
después de cualquier declaración:
return {
foo: 1
};