O que são closures no JavaScript?
Entender e saber como usar closures é essencial para escrever códigos JavaScript de alta qualidade e eficientes.
Javascript
13 jan 2023

O que são closures no JavaScript?
Closures são uma característica fundamental do JavaScript, e são utilizadas para criar funções com comportamento de "lembrar" o estado de sua execução anterior.
Em outras palavras, closures permitem que uma função tenha acesso ao escopo léxico (ou seja, o escopo de onde ela foi criada) mesmo quando essa função é chamada fora desse escopo.
Uma forma simples de entender closures é pensar em uma função dentro de outra função.
A função interna tem acesso aos parâmetros e variáveis da função externa, mesmo quando a função externa já foi executada e suas variáveis não estão mais disponíveis.
Como closures são criados?
Closures são criados automaticamente quando uma função é declarada dentro de outra função, e a função interna faz referência a alguma variável da função externa. Por exemplo:
function outerFunction(x) { function innerFunction() { console.log(x); } return innerFunction; } const closure = outerFunction(10); closure(); // imprime 10
Neste exemplo, a função outerFunction é a função externa e innerFunction é a função interna.
Quando chamamos a função outerFunction passando o valor 10 para x, uma closure é criada.
Ela é retornada e atribuída à variável closure. Quando chamamos closure(), a função interna é executada e imprime o valor de x, que é 10.
Aplicações comuns de closures
Closures são amplamente utilizadas em JavaScript para criar funções de callback, gerenciamento de escopo, e para otimizar o desempenho de aplicações. Algumas aplicações comuns incluem:
- Funções de callback: closures permitem que uma função seja passada como parâmetro para outra função, e essa função pode ser chamada posteriormente. Isso é muito útil em situações onde uma ação deve ser executada após outra ação ter sido concluída.
- Gerenciamento de escopo: closures permitem que uma função tenha acesso ao escopo léxico, mesmo quando essa função é chamada fora desse escopo. Isso é muito útil para garantir que variáveis e parâmetros não sejam acessíveis publicamente, aumentando a segurança e o encapsulamento de dados em sua aplicação.
- Otimização de desempenho: closures permitem que uma função "lembre" o estado de sua execução anterior, evitando a necessidade de recalcular ou recriar valores que já foram determinados. Isso pode melhorar significativamente o desempenho de sua aplicação, especialmente em casos de chamadas frequentes à mesma função.
Exemplos avançados de closures
Closures também podem ser usadas para criar funções construtoras e classes personalizadas. Por exemplo, a seguir é um exemplo de uma função construtora que utiliza closures para criar objetos com propriedades privadas:
function MyObject() { let privateProp = "Eu sou uma propriedade privada"; this.getPrivateProp = function() { return privateProp; } } const obj = new MyObject(); console.log(obj.privateProp); // undefined console.log(obj.getPrivateProp()); // "Eu sou uma propriedade privada"
Neste exemplo, a variável privateProp é declarada dentro da função construtora e não é acessível publicamente.
No entanto, a função getPrivateProp tem acesso a ela graças a closure. Assim, é possível expor métodos para acessar essa propriedade privada sem expô-la publicamente.
Resumo
Em resumo, closures são uma característica poderosa do JavaScript que permite que uma função tenha acesso ao escopo léxico mesmo quando chamada fora desse escopo.
Elas são amplamente utilizadas para criar funções de callback, gerenciamento de escopo e otimização de desempenho.
Além disso, closures também podem ser usadas para criar funções construtoras e classes personalizadas.