Há uma opção JSLint , uma das boas partes na verdade, que "[requer] parênteses em torno de invocações imediatas", o que significa que a construção
(function () {
// ...
})();
em vez disso, precisaria ser escrito como
(function () {
// ...
}());
Minha pergunta é a seguinte - alguém pode explicar por que essa segunda forma pode ser considerada melhor? É mais resiliente? Menos sujeito a erros? Qual a vantagem disso sobre a primeira forma?
Depois de fazer essa pergunta, passei a compreender a importância de se ter uma distinção visual clara entre os valores das funções e os valores das funções. Considere o caso em que o resultado da invocação imediata é o lado direito de uma expressão de atribuição:
var someVar = (function () {
// ...
}());
Embora os parênteses mais externos sejam sintaticamente desnecessários, o parêntese de abertura fornece uma indicação inicial de que o valor atribuído não é a própria função, mas sim o resultado da função que está sendo chamada.
Isso é semelhante ao conselho de Crockford sobre a capitalização das funções do construtor - serve como uma dica visual para qualquer pessoa que esteja olhando o código-fonte.
fonte
Respostas:
Do guia de convenção de estilo de Douglass Crockford : (pesquise "invocado imediatamente")
Quando uma função deve ser invocada imediatamente, toda a expressão de invocação deve ser agrupada em parênteses para que fique claro que o valor que está sendo produzido é o resultado da função e não a própria função.
Então, basicamente, ele sente que torna mais clara a distinção entre os valores das funções e os valores das funções. Portanto, é uma questão estilística, não é realmente uma diferença substantiva no código em si.
referência atualizada, o PPT antigo não existe mais
fonte
Funções anônimas imediatamente chamadas são agrupadas em parênteses porque:
Elas são expressões de função e deixar os parênteses de fora faria com que fossem interpretadas como uma declaração de função, o que é um erro de sintaxe.
Expressões de função não podem começar com a palavra função.
Ao atribuir a expressão de função a uma variável, a função em si não é retornada, o valor de retorno da função é retornado
, portanto, os parênteses avaliam o que está dentro deles e produzem um valor.quando a função é executada e os parênteses posteriores..}()
fazem com que a função seja executada imediatamente.fonte
Ou use:
fonte