Bem, primeiro eu provavelmente deveria perguntar se isso depende do navegador.
Eu li que, se um token inválido for encontrado, mas a seção de código for válida até esse token inválido, um ponto-e-vírgula será inserido antes do token, se for precedido por uma quebra de linha.
No entanto, o exemplo comum citado para erros causados pela inserção de ponto e vírgula é:
return
_a+b;
..que parece não seguir esta regra, pois _a seria um token válido.
Por outro lado, dividir as cadeias de chamadas funciona conforme o esperado:
$('#myButton')
.click(function(){alert("Hello!")});
Alguém tem uma descrição mais aprofundada das regras?
Respostas:
Antes de tudo, você deve saber quais instruções são afetadas pela inserção automática de ponto e vírgula (também conhecida como ASI por brevidade):
var
declaraçãodo-while
declaraçãocontinue
declaraçãobreak
declaraçãoreturn
declaraçãothrow
declaraçãoAs regras concretas do ASI estão descritas na especificação §11.9.1 Regras de inserção automática de ponto e vírgula
Três casos são descritos:
Quando é encontrado um token (
LineTerminator
ou}
) que não é permitido pela gramática, um ponto-e-vírgula é inserido antes dele se:LineTerminator
.}
por exemplo :
é transformado em
O
NumericLiteral
1
atende à primeira condição, o seguinte token é um terminador de linha.O
2
atende à segunda condição, o seguinte token é}
.Quando o final do fluxo de entrada de tokens é encontrado e o analisador não consegue analisar o fluxo de token de entrada como um único programa completo, um ponto-e-vírgula é inserido automaticamente no final do fluxo de entrada.
por exemplo :
é transformado em:
Esse caso ocorre quando um token é permitido por alguma produção da gramática, mas a produção é restrita , um ponto-e-vírgula é inserido automaticamente antes do token restrito.
Produções restritas:
O exemplo clássico, com o
ReturnStatement
:é transformado em
fonte
++c
para maior clareza?Diretamente da especificação ECMA-262, Fifth Edition ECMAScript :
fonte
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:
Outra citação: para o código
e:
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
não funcionará conforme o esperado, porque o intérprete JavaScript o tratará como:
Não deve haver quebra de linha imediatamente após o
return
:para que funcione corretamente. E você pode inserir um
;
você mesmo se seguir a regra de usar um;
após qualquer instrução:fonte
Com relação à inserção de ponto-e-vírgula e à instrução var, lembre-se de esquecer a vírgula ao usar var, mas expandindo várias linhas. Alguém encontrou isso no meu código ontem:
Ele foi executado, mas o efeito foi que a declaração / atribuição srcIds era global porque a declaração local com var na linha anterior não era mais aplicada, pois essa declaração foi considerada concluída devido à inserção automática de ponto e vírgula.
fonte
var srcRecords = src.records srcIds = [];
em uma linha e esquece a vírgula ou escreve "return a && b" e não esquece nada ... mas a quebra de linha antes do a insere um ponto-e-vírgula automático após o retorno, que é definido pelas regras ASI ...var
(let
,const
) em cada linha supera a fração de segundo que leva para digitá-la.A descrição mais contextual da Inserção automática de ponto e vírgula do JavaScript que encontrei vem de um livro sobre intérpretes de artesanato .
Ele continua descrevendo como você codificaria o cheiro .
fonte
Só para adicionar,
veja isso, usando a expressão de função imediatamente chamada (IIFE)
fonte