Cierre
Los Cierres son uno de los mas importantes, y a menudo menos entendidos conceptos en Javascript. No lo cubrire en detalle aqui, a cambio puede dirigirse al titulo Scope & Closures. Quiero decir algunas cosas acerca de el para que entienda el concepto general. Sera uno de las mas importantes tecnicas en su Javascript skillset.
Usted puede ver un cierre como una manera de "recordar" y continuar accediendo al ambito de la funcion (sus variables) incluso una vez la funcion halla terminado de ejecutarse.
function makeAdder(x) {
// parametro `x` es una variable interna
// funcion interna `add()` usa `x`, asi que
// tiene un "cierre/closure" sobre ella.
function add(y) {
return y + x;
};
return add;
}
La referencia a la funcion interna add( .. )
que se obtiene retornada con cada llamada a la funcion externa makeAdder( .. )
es capaz de recordar cualquier valor que sea pasado a x
en makeAdder( .. )
. Ahora, vamos a usar makeAdder( .. )
:
// `plusOne`obtine una referencia de la funcion
// `add(..)` con un cierre sobre el parametro `x` de
// la funcion externa `makeAdder(..)`
var plusOne = makeAdder( 1 );
// `plusOne`obtine una referencia de la funcion
// `add(..)` con un cierre sobre el parametro `x` de
// la funcion externa `makeAdder(..)`
var plusTen = makeAdder( 10 );
plusOne( 3 ); // 4 <-- 1 + 3
plusOne( 41 ); // 42 <-- 1 + 41
plusTen( 13 ); // 23 <-- 10 + 13
Mas de como este codigo trabaja:
- Cuando llamamos
makeAdder(1)
, obtenemos una referencia a la funcion internaadd()
que recuerdax
como1
. Llamamos esta referencia a la funcionplusOne(..)
. - Cuando llamamos
makeAdder(10)
, obtenemos otra referencia a la funcion internaadd()
que recuerdax
como10
. Llamamos esta referencia a la funcionplusTen(..)
. - Cuando llamamos
plusOne(3)
, esta agrega3
(su internay
) a el1
(recordada porx
), y obtenemos4
como resultado. - Cuando llamamos
plusTen(13)
, esta agrega13
(suy
interna) a el10
(recordada porx
), y obtenemos23
como resultado.
No se preocupe si esto le perece extraño y confuso a la primera -- lo puede ser! Tomara mucha practica entenderlo totalmente.
Pero creame, una vez lo entienda, sera una de las mas potentes y utiles tecnicas en toda la programacion. Definitivamente vale la pena dejar que su cerebro se cocine a fuego lento con los cierres por un momento. En la siguiente seccion, tendremos un poco mas de practica con los cierres/clousure.