Sintaxe de Chamada de Função Imediata

Existe uma opção JSLint , uma das “The Good Parts” que, de fato, “[requer] parênteses em torno de invocações imediatas”, significando que a construção

(function () { // ... })(); 

precisaria, em vez disso, ser escrito como

 (function () { // ... }()); 

Minha pergunta é essa: alguém pode explicar por que essa segunda forma pode ser considerada melhor? É mais resiliente? Menos propenso a erros? Qual a vantagem que tem sobre o primeiro formulário?


Desde que fiz esta pergunta, passei a entender a importância de ter uma clara distinção visual entre os valores das funções e os valores das funções. Considere o caso em que o resultado da chamada 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 que está sendo atribuído não é a function em si, mas o resultado da function que está sendo chamada.

Isso é semelhante ao conselho de Crockford em relação à capitalização de funções de construtor – ele serve como uma indicação visual para qualquer pessoa que esteja olhando para o código-fonte.

Do guia de convenções de Douglass Crockford: (procure por “invocado imediatamente”)

Quando uma function deve ser invocada imediatamente, toda a expressão de invocação deve ser envolvida em parens para que fique claro que o valor que está sendo produzido é o resultado da function e não da própria function.

Então, basicamente, ele sente que torna mais clara a distinção entre os valores das funções e os valores das funções. Então, é uma questão estilística, não é realmente uma diferença substantiva no próprio código.

referência atualizada, o PPT antigo não existe mais

Imediatamente chamadas de funções anônimas envolvê-lo em parênteses porque:

  1. São expressões de function e deixar os parênteses faz com que seja interpretado como uma declaração de function que é um erro de syntax.

  2. Expressões de function não podem começar com a palavra function.

  3. Ao atribuir a expressão de function a uma variável, a function em si não é retornada, o valor de retorno da function é retornado Assim, os pais avaliam o que está dentro deles e produzem um valor. quando a function é executada e os parêntesis posteriores ..}() fazem com que a function seja executada imediatamente.

Ou use:

 void function () { ... } ()