martes, 24 de marzo de 2009

Closures

Las closures son una parte vital del paradigma de Programación Funcional asi que vamos a darle una pequeña mirada a este concepto para aclarar las cosas un poco. Una closure es cuando definimos una funcion esta tiene acceso a las variables del entorno donde fue definida. Aun si la ejecución de ese entorno finalizó. Veamos un ejemplo porque estoy seguro que nadie entendio nada ja.

  function outer(c, d) {
var e = c * d;

function inner(a, b) {
return (e * a) + b;
}

return inner(2, 1);
}

como pueden ver en este simple ejemplo definimos una función dentro de otra sin embargo podemos ver que la funcion inner tiene acceso a la variable e que fue definida fuera de la funcion.
entonces si llamamos la funcion

outer(3,2) // returns 13

ahora veamos a que me refiero con que no importa si la funcion outter ya finalizó su ejecución.

function crearFuncion(c){
var a=3;
var b=4;
var func = function(x){
return a*b*c*x;
}
return func;
}

como podemos ver este ejemplo es aun más complicado pero nos permite reflejar el hecho de que en Javascript todo es un objeto, hasta las funciones son objetos y como las funciones pueden recibir objetos como parametros, y pueden devolver objetos, entonces tambien pueden recibir funciones y devolver funciones.
Veamos como utilizariamos esto

var f = crearFuncion(2);
alert(f(5)) // alerts 120 ( = 2*3*4*5)

// que ocurriría si hiciesemos ...
alert(crearFuncion(2)(5))


allí podemos ver que la funcion func (declarada dentro de crearFuncion) puede seguir utilizando las variables a,b,c (declarados dentro de crearFuncion) aún despues de que la ejecución de crearFuncion haya terminado.

eso son closures!

2 comentarios: