# Closure JavaScript: o que é e como usar

> Closure JavaScript é um mecanismo onde uma função interna mantém acesso ao escopo léxico da função externa, mesmo após a execução da função externa ser concluída. Essa característica permite criar variáveis privadas e funções de fábrica. O uso seguro ocorre em callbacks, contadores e módulos, evitando vazamento de memória ao liberar referências desnecessárias.

*Net Propaganda · Apps e Software · 26 de agosto de 2026 · Ptolomeu Rangel Sicupira*

Closure em JavaScript é a capacidade de uma função lembrar do escopo onde foi criada, mesmo após a execução. Veja como isso funciona na prática e quando usar com segurança.

Closure em JavaScript é um comportamento fundamental que permite a uma função acessar variáveis do escopo onde ela foi criada, mesmo depois que esse escopo já terminou de executar. Na prática, quando uma função é definida dentro de outra, ela "lembra" do ambiente léxico ao redor, o que inclui variáveis locais, parâmetros e até funções declaradas no escopo externo. Esse mecanismo é usado em padrões como módulos, contadores e funções de fábrica, mas exige cuidado com o ciclo de vida das variáveis e com o consumo de memória.

## O que é closure em JavaScript?

Closure é a combinação de uma função com as referências ao estado que a circunda, ou seja, o ambiente léxico. Quando você declara uma função dentro de outra, a função interna não apenas executa seu próprio corpo, mas também carrega consigo o escopo da função externa. Isso significa que, mesmo após a função externa retornar, a função interna ainda consegue acessar e manipular as variáveis daquele escopo. Um exemplo clássico é o contador privado:

function contador() { let valor = 0; return function() { valor++; return valor; }; }

const incrementar = contador(); console.log(incrementar()); // 1 console.log(incrementar()); // 2

Aqui, a função anônima retornada mantém acesso à variável valor, mesmo depois que contador() foi executada. Essa persistência é o que caracteriza uma closure.

## Como o escopo léxico se relaciona com closure?

O escopo léxico define quais variáveis uma função pode acessar com base na sua posição no código, não no momento da chamada. Em JavaScript, toda função tem acesso ao escopo onde foi declarada, e não ao escopo onde foi invocada. A closure explora exatamente essa característica: a função interna "enxerga" as variáveis do escopo externo porque esse escopo faz parte do seu ambiente léxico. Isso é diferente de linguagens como C ou Java, onde o escopo é determinado em tempo de execução, sem esse tipo de memória persistente.

Um ponto de atenção: o escopo léxico é estático, mas as variáveis são dinâmicas. Ou seja, a closure acessa o valor atual da variável, não uma cópia do valor no momento da criação. Se a variável for alterada depois, a closure verá o valor atualizado.

## Por que closures são úteis no dia a dia?

Closures resolvem problemas práticos de encapsulamento e estado. Elas permitem criar variáveis privadas, algo que JavaScript não tem nativamente. Em vez de expor uma variável global, você pode criar uma função que retorna funções com acesso controlado a um estado interno. Isso é comum em módulos, onde se quer esconder detalhes de implementação. Closures também são a base para funções de alta ordem, como map, filter e reduce, que recebem funções como argumento e muitas vezes precisam "capturar" valores do escopo externo.

Outro uso frequente é em eventos e callbacks. Quando você registra um callback que precisa acessar dados de um loop, a closure preserva o valor correto de cada iteração, desde que você use let ou crie um novo escopo a cada iteração.

## Quais são os riscos e cuidados ao usar closures?

O principal risco é o consumo de memória. Cada closure mantém viva a referência ao escopo externo, mesmo que a função externa já tenha retornado. Se você criar muitas closures em um loop, por exemplo, pode manter objetos desnecessários em memória, prejudicando a performance. Outro cuidado é com o valor de variáveis em loops. Se você usar var dentro de um loop, a closure captura a mesma variável para todas as iterações, resultando em valores inesperados. Com let, cada iteração recebe um novo escopo, resolvendo o problema.

Um contraexemplo comum:

for (var i = 0; i

---

Fonte (canonical): https://netpropaganda.com.br/apps-e-software/closure-javascript-o-que-e-e-como-usar/
