Desvendando o Design Pattern IIFE em JavaScript

William Koller
3 min readAug 21, 2024

--

Introdução

JavaScript, uma das linguagens de programação mais populares no mundo, oferece uma série de padrões de design que facilitam a criação de código modular, reutilizável e organizado. Um desses padrões é o IIFE (Immediately Invoked Function Expression). Se você já se deparou com uma função que se auto-executa logo após ser definida e ficou curioso sobre como e por que isso acontece, este artigo é para você.

O que é um IIFE?

IIFE, ou Immediately Invoked Function Expression, é um padrão em JavaScript onde uma função é definida e imediatamente executada. Este padrão é amplamente utilizado para criar escopos locais, evitando assim a poluição do escopo global e protegendo o código de colisões com outras variáveis ou funções.

A sintaxe de um IIFE é simples e direta:

(function() {
// Código aqui dentro
})();

Vamos quebrar essa sintaxe:

  1. Parênteses ao redor da função: (function() { ... }) - Isso transforma a função em uma expressão de função.
  2. Parênteses após a função: (...) - Isso chama a função imediatamente após sua definição.

Por que usar um IIFE?

1. Isolamento de Escopo

Um dos principais motivos para usar um IIFE é o isolamento de escopo. Em JavaScript, variáveis definidas dentro de uma função não são acessíveis fora dela. Portanto, ao encapsular seu código dentro de um IIFE, você garante que as variáveis e funções internas não interfiram com outras partes do código.

(function() {
var mensagem = "Olá, IIFE!";
console.log(mensagem); // "Olá, IIFE!"
})();

console.log(mensagem); // ReferenceError: mensagem is not defined

2. Evitar Conflitos de Nomes

Em projetos grandes, é comum que múltiplos desenvolvedores trabalhem no mesmo código, o que pode levar a conflitos de nomes de variáveis e funções. Com o IIFE, você pode evitar esses conflitos ao garantir que suas variáveis e funções permaneçam dentro de seu próprio escopo.

(function() {
var contador = 0;
// Outras operações
})();

(function() {
var contador = 10;
// Outras operações
})();

3. Código Limpo e Modular

IIFE permite que você escreva código de forma modular, onde cada bloco de código pode ser encapsulado em uma função auto-executável. Isso não apenas mantém o código organizado, mas também facilita a leitura e manutenção.

(function() {
// Módulo A
var moduloA = {
iniciar: function() {
console.log("Módulo A iniciado");
}
};
moduloA.iniciar();
})();

(function() {
// Módulo B
var moduloB = {
iniciar: function() {
console.log("Módulo B iniciado");
}
};
moduloB.iniciar();
})();

4. Compatibilidade com ES5 e versões anteriores

Embora o ES6 tenha introduzido let e const para escopos de bloco, o IIFE continua sendo útil, especialmente ao trabalhar com código legado ou em ambientes onde o ES6 não é totalmente suportado.

Usos Comuns de IIFE

1. Bibliotecas JavaScript

Muitas bibliotecas JavaScript utilizam IIFE para encapsular seu código, protegendo suas implementações internas de interferências externas. Um exemplo clássico é o jQuery:

(function(window, document, undefined) {
// Código da biblioteca
})(window, document);

2. Inicialização de Código

O IIFE também é usado para executar código imediatamente após o carregamento, como inicializar variáveis ou configurar eventos.

(function() {
var configuracoes = {
tema: "escuro",
lingua: "pt-BR"
};
console.log("Configurações carregadas:", configuracoes);
})();

Conclusão

O padrão IIFE é uma ferramenta poderosa no arsenal de um desenvolvedor JavaScript. Ele oferece uma maneira elegante de evitar a poluição do escopo global, proteger variáveis e funções de conflitos e manter o código organizado. Embora as versões mais recentes do JavaScript ofereçam novas formas de lidar com escopos e módulos, o IIFE continua sendo uma solução prática e eficaz para muitos problemas de escopo em JavaScript.

Se você ainda não usou IIFE em seus projetos, experimente e veja como ele pode melhorar a qualidade e a organização do seu código.

--

--

William Koller
William Koller

Written by William Koller

Senior Software Engineer (Backend)

No responses yet