sexta-feira, 21 de janeiro de 2011

Clausuras Javascript

A pedido de um grande amigo, vou escrever um pouco sobre o tema.

"Eita nome feio! Deve ser difícil!". Este provavelmente é o primeiro pensamento que você teve ao ler o título.
Bem, o nome é feio, mas entender o conceito é bem...bom, é difícil mesmo. Então vamos lá.

Clausuras, se tratando de programação, são expressões (funções) que podem ter variáveis livres juntas e que possuem um ambiente que as mantêm unidas.

Ok. Começamos mal. Mas vamos simplificar. Clausuras são variáveis de uma função que na verdade são funções. Ou falando de outra forma, são funções internas de uma função que possuem escopo próprio, variáveis próprias, parâmetros próprios, mas possuem acesso ao escopo do ambiente ao qual estão contidas e podem ser acessadas de fora da função que as contêm.

No fim das contas, é difícil falar, mas é fácil implementar.

Vamos a um exemplo:

        function funcaoAmbiente(){
            variavelAmbiente = "Escopo externo";
            this.funcaoClausura1 = function(){
                alert(variavelAmbiente);
            }
            return this;
        }
       
        var teste = funcaoAmbiente();
        teste.funcaoClausura1();

Percebam três coisas importantes:
1) funcaoAmbiente foi atribuída a uma variável, e sua referência foi entendida como um objeto.
2) A função interna tem acesso ao escopo da função ambiente.
3) Foi possível, através da referência da função ambiente chamar a função interna.

Com isso, é possível simular orientação a objeto, criar callbacks, etc em Javascript. Esta técnica é largamente utilizada nas principais libs e frameworks Javascript, como por exemplo, JQuery e ExtJS.

Existe muito mais assunto para falar sobre clausuras, mas isso daria uns 10 posts. Acredito que o ponto mais importante, seria o cuidado com a utilização de escopo, pois poderia gerar (e já ví acontecendo) memory leaks terríveis.

Existe um post que eu achei que fala largamente sobre o assunto, seus benefícios e seus problemas. É este aqui.
No futuro talvez eu fale mais sobre o assunto, mas por enquanto, fiquem com essa pincelada básica.

Nenhum comentário:

Postar um comentário