Eu não conseguia entender muito bem essas três regras nas especificações - espero ter algo mais claro em inglês -, mas aqui está o que coletei do JavaScript: The Definitive Guide, 6a Edição, David Flanagan, O'Reilly, 2011:
Citar:
O JavaScript não trata todas as quebras de linha como ponto-e-vírgula: normalmente trata as quebras de linha como ponto-e-vírgula somente se não puder analisar o código sem o ponto e vírgula.
Outra citação: para o código
var a
a
=
3 console.log(a)
O JavaScript não trata a segunda quebra de linha como ponto e vírgula, pois pode continuar analisando a instrução mais longa a = 3;
e:
duas exceções à regra geral de que o JavaScript interpreta quebras de linha como ponto-e-vírgula quando não puder analisar a segunda linha como uma continuação da instrução na primeira linha. A primeira exceção envolve as instruções de retorno, interrupção e continuação
... Se uma quebra de linha aparecer após qualquer uma dessas palavras ... O JavaScript sempre interpretará essa quebra de linha como ponto e vírgula.
... A segunda exceção envolve os operadores ++ e − ... Se você deseja usar um desses operadores como operadores postfix, eles devem aparecer na mesma linha que a expressão à qual se aplicam. Caso contrário, a quebra de linha será tratada como ponto e vírgula e o ++ ou - será analisado como um operador de prefixo aplicado ao código a seguir. Considere este código, por exemplo:
x
++
y
É analisado como x; ++y;
, não comox++; y
Então, acho que para simplificá-lo, isso significa:
Em geral, JavaScript irá tratá-lo como continuação de código enquanto faz sentido - exceto 2 casos: (1) depois de algumas palavras-chave como return
, break
, continue
, e (2) se vê ++
ou --
em uma nova linha, em seguida, ele irá adicionar o ;
no final da linha anterior.
A parte sobre "tratá-lo como continuação de código, desde que faça sentido" faz com que pareça a correspondência gananciosa da expressão regular.
Com o exposto acima, isso significa que, return
com uma quebra de linha, o intérprete JavaScript inserirá um;
(citado novamente: se uma quebra de linha aparecer após qualquer uma dessas palavras [como return
] ... JavaScript sempre interpretará essa quebra de linha como ponto e vírgula)
e por esse motivo, o exemplo clássico de
return
{
foo: 1
}
não funcionará conforme o esperado, porque o intérprete JavaScript o tratará como:
return; // returning nothing
{
foo: 1
}
Não deve haver quebra de linha imediatamente após o return
:
return {
foo: 1
}
para que funcione corretamente. E você pode inserir um ;
você mesmo se seguir a regra de usar um ;
após qualquer instrução:
return {
foo: 1
};