Se você não se importa com o valor de retorno do IIFE, pode ser qualquer um dos seguintes:
!function(){}(); // => true~function(){}(); // => -1+function(){}(); // => NaN-function(){}(); // => NaN
Vamos explorar isso um pouco mais.
Todo o trabalho é o mesmo. Começa a ficar interessante quando um dos módulos está faltando um ponto-e-vírgula:
Com um ponto-e-vírgula faltando, cada conjunto de parênteses está tentando imediatamente evocar a expressão anterior. Esse seria o valor de retorno do IIFE.
Então a diferença é quando o TypeError acontece. Vamos ver o que os argumentos estão a fazer. Note que console.log()
retorna indefinido:
Agora vamos fazer o mesmo exemplo com o caminho crockford:
Mas espere, não há TypeError aqui…
Não há TypeError por causa da função retornada. A função retornada que registra os argumentos é então invocada com o valor de retorno do módulo2, que é indefinido. Com esse entendimento, vamos voltar ao exemplo original, onde havia um TypeError:
Conclusão
Os (function{})();
e (function(){}());
IIFEs podem agir de forma diferente na situação de ponto-e-vírgula ausente.
Utilizar linter ou uma ferramenta para ter certeza de que os módulos não estão faltando ponto-e-vírgula quando se trabalha com módulos.
Para ser extra seguro, adicione um ponto-e-vírgula principal ao IIFE: