No es necesario navegador/implentation, pero Section 7.9 Automatic Semicolon Insertion
del ECMAScript Language Specification es una lectura.
7.9 Punto y coma automática de inserción
Algunas de las declaraciones de ECMAScript (declaración vacía, Sentencia de variable, declaración de la expresión, do-while declaración, continuar declaración, declaración de la rotura, instrucción de retorno, y la instrucción throw) debe ser terminado con punto y coma. Tales puntos y comas siempre pueden aparecer de forma explícita en el texto fuente. Para la conveniencia de , sin embargo, tales puntos y comas pueden omitirse del texto fuente en ciertas situaciones. Estas situaciones se describen diciendo que los puntos y comas se insertan automáticamente en el código fuente token en esas situaciones.
7.9.1 Reglas de inserción automática y coma Hay tres reglas básicas de la inserción punto y coma:
Cuando, ya que el programa se analiza de izquierda a derecha, una muestra (llamado el token infractor) se encontrado que no está permitido por cualquier producción de la gramática, a continuación, un punto y coma se inserta automáticamente antes de que el contador infractor si una o más de las siguientes condiciones es verdadera:
- el offe nding token está separado del token anterior por al menos un LineTerminator.
- El token ofensor es}.
Cuando, ya que el programa se analiza de izquierda a derecha, al final de la secuencia de entrada de fichas se encuentra y el analizador no puede analizar el flujo de token de entrada como un solo programa de ECMAScript completa, entonces un punto y coma se inserta automáticamente al final de la secuencia de entrada.
Cuando, ya que el programa se analiza de izquierda a derecha, se encuentra una señal de que esté permitida por alguna producción de la gramática, pero la producción es una producción restringida y el token sería el primer token para una ¿terminal o no terminal inmediatamente después de la anotación? [no LineTerminator aquí]? dentro de la producción restringida (y, por lo tanto, un token se llama token restringido), y el token restringido es separado del token anterior por al menos un LineTerminator, luego se inserta un punto y coma automáticamente antes del token restringido. Sin embargo, hay una condición adicional anulante en las reglas anteriores: un punto y coma nunca se inserta automáticamente si el punto y coma se analizaría como una instrucción vacía o si ese punto y coma se convertiría en uno de los dos puntos y comas en el encabezado de declaración (ver 12.6.3). NOTA Las siguientes son las únicas producciones restringidas en la gramática: PostfixExpression: LeftHandSideExpression [no LineTerminator aquí] ++ LeftHandSideExpression [no LineTerminator aquí] - ContinueStatement: continúan [no LineTerminator aquí] Identificador; BreakStatement: break [no LineTerminator aquí] Identificador; ReturnStatement: return [no LineTerminator here] Expresión; ThrowStatement: throw [no LineTerminator here] Expresión; El efecto práctico de estas producciones restringidas es el siguiente: Cuando se encuentra un token ++ o - donde el analizador lo trataría como un operador postfix, y al menos un LineTerminator ocurrió entre el token anterior y el ++ o - token, entonces un punto y coma se inserta automáticamente antes del token ++ o -. Cuando se encuentra un token continuar, romper, devolver o arrojar y se encuentra un LineTerminator antes del el siguiente token, se inserta automáticamente un punto y coma después del token continue, break, return o throw. El consejo práctico resultante para los programadores de ECMAScript es: Un operador postfix ++ o - debe aparecer en la misma línea que su operando. Una expresión en una instrucción return o throw debería comenzar en la misma línea que el token return o throw. Un identificador en una sentencia break o continue debe estar en la misma línea que el token break o continue.
7.9.2 Ejemplos de Automatic Semicolon Inserción
La fuente
{ 1 2 } 3
no es una sentencia válida en la gramática ECMAScript, incluso con las reglas de inserción de punto y coma automáticas. En contraste, la fuente
{ 1
2 } 3
también no es una sentencia ECMAScript válido, sino que se transforma mediante la inserción punto y coma automática en la siguiente:
{ 1
;2 ;} 3;
que es una sentencia de ECMAScript válida. La fuente
for (a; b
)
no es una sentencia de ECMAScript válida y no se ve alterado por la inserción automática de punto y coma porque se necesita el punto y coma para la cabecera de una instrucción for. La inserción automática de punto y coma nunca inserta uno de los los dos puntos y comas en el encabezado de una instrucción for. La fuente
return
a + b
se transforma mediante la inserción punto y coma automática en la siguiente:
return;
a + b;
NOTA La expresión a + b no se trata como un valor a ser devuelto por la instrucción de retorno, debido a que un LineTerminator lo separa de la devolución de token. La fuente
a = b
++c
se transforma mediante la inserción punto y coma automática en la siguiente:
a = b;
++c;
NOTA El token ++ no se trata como un operador de sufijo aplicar a la variable b, porque se produce una LineTerminator entre b y ++. La fuente
if (a > b)
else c = d
no es una sentencia de ECMAScript válida y no se ve alterado por la inserción punto y coma automática antes de que el otro modo, a pesar de que no hay producción de la gramática se aplica en ese momento, debido a que un punto y coma inserta automáticamente entonces ser analizado como una declaración vacía. La fuente
a = b + c
(d + e).print()
no se transforma mediante la inserción punto y coma automática, porque la expresión parenthesised que comienza la segunda línea puede ser interpretada como una lista de argumentos para una llamada de función:
a = b + c(d + e).print()
En la circunstancia que una instrucción de asignación debe comenzar con un paréntesis izquierdo, es una buena idea que el programador proporcione un punto y coma explícito al final de la instrucción anterior en lugar de confiar en la inserción automática de punto y coma .
posiblemente mejor duplicado: [¿Por qué los resultados varían en función de la colocación de la llave?] (Http://stackoverflow.com/q/3641519/1048572) – Bergi