Explique porque o seguinte não funciona como um IIFE: `function foo(){ }();`. O que precisa ser alterado para torná-lo corretamente um IIFE?
IIFE significa expressões de função imediatamente invocadas. O interpretador JavaScript lê function foo(){ }();
como function foo(){ }
e ();
, onde o primeiro é uma declaração de função e o último (um par de parênteses) é uma tentativa de chamar uma função, mas não há nome especificado, portanto, ele retorna Uncaught SyntaxError: Unexpected token )
.
Aqui estão duas maneiras de corrigir que envolve a adição de mais parênteses: (function foo(){ })()
e (function foo(){ }())
. Declarações que começam com function
são consideradas como function declarations ao envolver essa função dentro de ()
, ela se torna uma function expression que pode ser executada com o ()
subsequente. Essas funções não são expostas no escopo global e você pode até omitir o nome delas se não precisar fazer referência a si mesmas dentro do corpo.
Você também pode usar o operador void
: void function foo(){ }();
. Infelizmente, há um problema com essa abordagem. A avaliação da expressão fornecida é sempre undefined, então, se sua função IIFE retornar algo, você não poderá usá-la. Um exemplo:
const foo = void (function bar() {return 'foo';})();console.log(foo); // indefinido