Closures

O que são e como funcionam?

Posted by Raphael Lima on 10-01-2017

Neste 4º post sobre funções JavaScript, iremos falar sobre um conceito que é uma característica definidora do JavaScript e uma funcionalidade da programação funcional… As Closures. Usar closures não é só para que possamos escrever menos código, ajuda também na redução da complexidade para que nosso código possua funcionalidades avançadas, as quais sem closures dificilmente conseguiríamos dada sua complexidade.

O que é e como funciona uma Closure?

Quando uma função é declarada, é criado um escopo que permite à função a acessar e manipular váriaves externas a ela, esse escopo criado é chamado de closure. Ou seja, uma closure permite que uma determinada função acesse outras funções e também variáveis, desde que estas estejam no mesmo escopo da closure.

Vejamos o seguinte exemplo:

var varExterna = 'valor externo',
    funcaoInterna;

function funcaoExterna() {
  var varInterna = 'valor interno';

  function interna() {
    console.log('Variável acessada: ', varExterna);
    console.log('Variável acessada: ', varInterna);
  }

  funcaoInterna = interna;
}

funcaoExterna();
funcaoInterna();

//Saída da execução:
//Variável acessada: valor externo
//Variável acessada: valor interno

Vamos analisar o funcionamento do código acima e ver como funciona a closure na pratica: Temos duas funções declaradas, funcaoExterna e interna. A primeira, pertence ao escopo global, ou seja, podemos invocá-la de qualquer lugar de nosso código. Mas e a segunda função que está dentro da funcaoExterna, como podemos chama-la? No código, ambas são chamadas em sequência e funcionam perfeitamente. Como? Mágica? Não, closures! Embora a função interna ter sido declarada dentro da funcaoExterna, no final, atribuimos sua referência para uma referência do escopo global, ou seja, a variável funcaoInterna. Isso nos permite que a função seja executada sem nenhum problema, mesmo que o escopo da funcaoExterna já tenha sido destruído e não está mais disponível. Portanto, nesse código, declarar interna dentro da funcaoExterna, não foi apenas uma declaração definida, foi criada uma closure e com isso temos uma execução que abrange a declaração da função e todas as variáveis que estão no mesmo escopo no momento da execução. Ou seja, mesmo ela tendo sido executada após o escopo da função externa ter desaparecido, ela possui acesso ao escopo no qual ela foi criada por meio da closure.

Resumindo, closures criam uma espécie de “bolha” para as funções e variáveis que estão no escopo no momento da declaração a fim de garantir que a função tenha tudo que for necessário para que seja executada.

Bom, por hoje é só… Acompanhem os próximos posts e deixem seus comentários…