segunda-feira, 28 de setembro de 2009

Javascript closures

Bom dia!
Tal como tinha dito, irei neste post falar sobre closures. Os closures são uma das features mais importantes do javascript.
É algo dificil de explicar o que é o closure, mas vou tentar dar um exemplo totalmente académico e demonstrar a partir do exemplo:
<script>
function sum(x)
{
return function (y){
return x+y;
}
}
var sumaux=sum(5);
var result=sumaux(4);
alert(result==9); //true
</script>

Neste código, temos uma função sum que retorna uma outra função. Se repararmos "sum" leva x por parametro. À variavel sumaux fica atribuida a função anónima que leva como parametro y. A grande vantagem do closure, é que permite que sumaux, tenha em memória o valor 5 passado para o parametro x na instanciação, portanto, se executarmos sumaux (que é uma função), está irá lembrar-se do valor x pois foi instanciada com x=5.

Penso que estamos em condições agora de perceber o código abaixo:

window.alert = function(native) {
return function(e) {
native(e);
vbalert(e);
}
}(window.alert);

Esta instrução faz um conjunto de tarefas. A primeira linha é uma atribuição da função window.alert a uma função que iremos definir e que leva por parametro a variavel native(que se pretende que seja uma função). Dentro desta função iremos retornar uma outra função que vai invocar a função native com o parametro que for passado (neste caso a variavel e).
Portanto, se passarmos para a função principal o argumento native=window.alert (correspondente á ultima linha), a função que estamos a retornar irá conter:

return function(e)
{
window.alert(e);
vbalert(e);
}

Para finalizar estamos a igualar window.alert ás linhas que estão acima, ou seja, se executar window.alert('xpto'); estamos na verdade a executar as 2 linhas que estão dentro desta função anónima.

Sem comentários: