Closures
[ enclausuramento ]

Para quem está dando os primeiros passos no Javascript, saber isso pode parecer irrelevante. Agora, sem o domínio desse mecanismo, eu pergunto:
- Você vai realmente entender como construir uma aplicação?
- Saberá o que acontece?
- Como funciona?
- Se é importante?
Creio que não… Saber conceitos básicos e fundamentais como esse são pré requisito para começar a programar em alto nível com Javascript.
O que é uma closure?
É uma função interior que tem acesso a variáveis de uma função exterior.
A closure tem acesso a três níveis de escopo:
- ao seu próprio escopo (variáveis definidas entre suas chaves)
- as variáveis da função exterior
- e as variáveis globais.
Não entendeu?
Para aprender o que é uma closure, primeiro você precisa entender alguns outros conceitos sobre funções de JavaScript e seus escopos.
Como eu crio uma closure?
Em JavaScript, closures são criadas sempre que uma função é criada.
Quando são usadas?
Closures são freqüentemente usadas em event handlers, callbacks, currying e outros padrões da programação funcional. Entre outras coisas, também são comumente usados para dar privacidade aos dados na função.
Como usar?
Para usar uma closure, simplesmente defina uma função dentro de outra função e exponha-a. Ou seja, deve retorná-la ou passá-la para outra função.
Por que é importante?
Elas nos permitem trabalhar com alguns conceitos extremamente úteis em nossas aplicações, como:
- encapsulamento de variáveis e métodos
- alteração de escopo
- criação de módulos
- criação fábricas de funções -factories

No exemplo simples acima, temos três funções e todas elas são definidas e imediatamente invocadas, para que todos criem escopos e closures.
O escopo da função one() é seu corpo. O encerramento nos dá acesso tanto ao seu alcance quanto ao alcance global.
O escopo da função two() é seu corpo. O encerramento nos dá acesso ao seu alcance, além do escopo da função one() mais o escopo global
E, da mesma forma, o fechamento da função three() nos dá acesso a todos os escopos no exemplo. É por isso que conseguimos acessar todas as variáveis da função three().
E quando a definição e invocação de funções são de escopos diferentes? Vamos ver se você acerta essa!

Se você entendeu que a resposta é 1, está no caminho certo.
O motivo é: os escopos e as closures são diferentes.
Na linha 4, o console.log para exibir gols usará a closure de time1, que é criado quando definimos time1. Isso significa que o encerramento de time1 nos da acesso apenas ao alcance de time1 mais o escopo global.
Closures têm acesso de leitura e gravação

A função dentro(), quando definida, cria uma closure que nos dá acesso à variável valor. Podemos ler e modificar essa variável. E, se a modificarmos, estaremos modificando a variável valor no escopo da função fora(). Ou seja, esse código irá imprimir 43 porque usamos a função dentro() para
Este código irá imprimir 43 porque usamos a closure da função dentro() para modificar a mesma variável da função fora().
É por isso que podemos mudar as variáveis globais em todos os lugares. Todos os fechamentos nos dão acesso de leitura e gravação a todas as variáveis globais.
Desafio
Veremos se agora você realmente aprendeu os mecanismos de uma closure.

