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, returncom 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
};