Sabem aqueles conceitos, que a gente sempre utiliza e chega alguém com um nome “pomposo” para a parada (que você nunca ouviu falar)? Isso aconteceu comigo com closures.
Entendi o conceito de closures enquanto estudava Ruby. Na verdade, fica a dica… se você quer aprender Orientação a Objetos, aprenda linguagens dinâmicas como Ruby, Python e até mesmo PHP. Depois parta para linguagens mais “hardcore” como Java e C++.
Vamos deixar a Wikipedia nos explicar o que é uma closure:
Uma closure ocorre normalmente quando uma função é declarada dentro do corpo de outra, e a função interior referencia variáveis locais da função exterior. Em tempo de execução, quando a função exterior é executada, então uma closure é formada, que consiste do código da função interior e referências para quaisquer variáveis no escopo da função exterior que a closure necessita.
Ok… sou a favor das pessoas que dizem que é difícil compreender alguns conceitos apenas por parágrafos formados por palavras bem escritas. Vamos ao exemplo:
var digaSeuNome = function(nome) {
var msg = "Olá " + nome + ". Seja bem-vindo!";
var exibeMensagem = function() {
alert(msg);
};
exibeMensagem();
};
digaSeuNome("João"); // Olá João. Seja bem-vindo!
Temos uma função definida dentro de outra função. A função interna utiliza de parâmetros e variáveis da função externa… basicamente, este é o conceito de closure.
Não achou muito útil? Dê uma olhada no exemplo abaixo:
var FabricaDeUsuarios = function() {
var id = 0;
var criaUsuario = function(nome) {
id++;
return {
id: id,
nome: nome,
};
};
return criaUsuario;
};
var novoUsuario = FabricaDeUsuarios();
var joao = novoUsuario("João");
var jose = novoUsuario("José");
alert(joao.id); // 1
alert(jose.id); // 2
Utilizamos o conceito de closure no exemplo acima. Abusamos do
contexto da linguagem, onde, mesmo que estejamos “chamando” a função
fora do escopo de FabricaDeUsuarios
, na verdade novoUsuario
trata-se de uma referência a função criaUsuario
. Logo, ainda
estaremos utilizando os recursos do contexto de FabricaDeUsuarios
.
E você… tem algum exemplo bacana sobre closures? Não deixe de comentar.