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.