Bueno, primero probablemente debería preguntar si esto depende del navegador.
He leído que si se encuentra un token no válido, pero la sección de código es válida hasta ese token no válido, se inserta un punto y coma antes del token si está precedido por un salto de línea.
Sin embargo, el ejemplo común citado para los errores causados por la inserción de punto y coma es:
return
_a+b;
..que no parece seguir esta regla, ya que _a sería un token válido.
Por otro lado, romper las cadenas de llamadas funciona como se esperaba:
$('#myButton')
.click(function(){alert("Hello!")});
¿Alguien tiene una descripción más detallada de las reglas?
Respuestas:
En primer lugar, debe saber qué declaraciones se ven afectadas por la inserción automática de punto y coma (también conocido como ASI por brevedad):
var
declaracióndo-while
declaracióncontinue
declaraciónbreak
declaraciónreturn
declaraciónthrow
declaraciónLas reglas concretas de ASI se describen en la especificación §11.9.1 Reglas de inserción automática de punto y coma
Se describen tres casos:
Cuando se encuentra un token (
LineTerminator
o}
) que no está permitido por la gramática, se inserta un punto y coma antes si:LineTerminator
.}
por ejemplo :
se transforma en
El
NumericLiteral
1
cumple con la primera condición, el siguiente token es un terminador de línea.El
2
cumple con la segunda condición, el siguiente token es}
.Cuando se encuentra el final del flujo de entrada de tokens y el analizador no puede analizar el flujo de tokens de entrada como un único Programa completo, se inserta automáticamente un punto y coma al final del flujo de entrada.
por ejemplo :
se transforma en:
Este caso ocurre cuando un token es permitido por alguna producción de la gramática, pero la producción es una producción restringida , un punto y coma se inserta automáticamente antes del token restringido.
Producciones restringidas:
El ejemplo clásico, con
ReturnStatement
:se transforma en
fuente
++c
para mayor claridad?Directamente de la ECMA-262, quinta edición de la especificación ECMAScript :
fuente
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:
Otra cita: para el código
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
no funcionará como se esperaba, porque el intérprete de JavaScript lo tratará como:
No debe haber un salto de línea inmediatamente después de
return
:para que funcione correctamente. Y puede insertar un
;
mensaje si sigue la regla de usar un;
después de cualquier declaración:fuente
Con respecto a la inserción de punto y coma y la declaración var, tenga cuidado de olvidar la coma cuando se usa var pero abarca varias líneas. Alguien encontró esto en mi código ayer:
Se ejecutó, pero el efecto fue que la declaración / asignación de srcIds era global porque la declaración local con var en la línea anterior ya no se aplicaba ya que esa declaración se consideraba terminada debido a la inserción automática de punto y coma.
fuente
var srcRecords = src.records srcIds = [];
en una línea y olvidas la coma o escribes "return a & b" y no olvidas nada ... pero el salto de línea antes de la a insertaría un punto y coma automático después de la devolución, que se define por las reglas ASI ...var
(let
,const
) en cada línea supera la fracción de segundo que se necesita para escribirla.La descripción más contextual de la inserción automática de punto y coma de JavaScript que he encontrado proviene de un libro sobre Crafting Interpreters .
Continúa describiéndolo como codificarías el olor .
fuente
Solo para agregar,
vea esto, utilizando la expresión de función invocada inmediatamente (IIFE)
fuente