¿Qué es un closure en Javascript?

Voy a contestar sin ejemplos acerca de una forma simple de entender closures, por 2 razones principales

1.- Está ampliamente explicado en la web y en cualquier referencia seria de Javascript

2.- Porque no lo sé (De heho soy el autor del canal “yo no sé tampoco” , de lo cual estoy orgulloso…. a diferencia de tanta otra gente que alega saber todo: Yo no sé tampoco)

Pero aunque no sepa lo que es aquí va una respuesta simple y un corolario (que puede ser cierto o no)

1.- sin ser estricto un closure es una función “inner” que tiene acceso no solo a sus variables (como todas las funciones)… sino también a las variables de la función que la contiene.

Explico lo simple. Al mencionar función “inner” ya estamos hablando de una función dentro de otra. Generalmente en el patrón closure la función externa devuelve como resultado la función interna. (si la funcion interna es innerHacealgoDeUnaVez(parametro1)…. la función externa terminará con un

return innerHaceAlgoDeUnaVez;

Entonces cuando llamamos a la outer function el resultado será la inner function… es decir que la variable donde guardamos el resultado la podemos ejecutar.

Si tenemos

x = outerFunction(bla bla bla);

mas adelante podemos ejecutar

x(valorParaElParametro1DeLainnerFunction);

Ok?

La magia que ocurre es que si dentro de la inner function usamos variables locales o parámetros que están en la outer function …esas variable están disponibles… pero en el contexto del momento que llamamos a la outer function.

De nuevo… por mas que parezca simple lo que nos parece increible es que hayan hecho tanto lío para hacer lo mismo que hacen los objetos (o clases) en javascript.

Entonces mi primera apreciación es

Para qué tener una construcción gramatical que nos permite expresar lo que ya podíamos hacer con las clases?

Y mi primera respuesta , basada en estudios psicológicos es: para 2 razones principales.

1.- Aumentar el ego de los que entienden closures (que en general no saben bailar y tienes otras limitaciones al tratar con otras personas o hacer deportes)

2.- Para excluir a todos los que no saben closures en las conversaciones.

Pero dejando de lado mi impulso emocional primario … encontré más razones para que los closures vengan a la existencia y provean una forma de expresar cosas que antes no se podían expresar en jAVASCRIPT.

Para empezar, aún si fueran simpes sinónimos , sería una construcción gramatical válida, tal como existen sinónimos en el lenguaje natural.

Pero econtré una utilidad adicional , y puede que existan muchas más.

Y es la siguiente.

Como dijimos (perdón … no soy Golum…. como dije)… puedo comparar elclosure a un método de una clase que accede a propiedades de esa clase. En el closure se acceden a las variables de la outer function. En el método de la clase se acceden a las propiedades de la clase.

Pero cuál es la diferencia? Para acceder a las propiedades de una clase, se accedería con this.propiedadDeLaClase. Great!!!!!!

Para acceder a la variable de la outer class, se accedería directamente usando la variable declarada en la outer class ….. Great!!!!!

Dónde está la diferencia? Que la propiedad de la clase se accede con this (this.propiedadDeLaClase)

Y el tema es que por Javascript no ser fuertemente tipado sólo podemos saber si algo después de un this. es válido en tiempo de ejecución. Porque no sabemos si alguien agregó alguna propiedad al objeto de esa clase en algún momento. Pero tenemos mecanismos para detectar al “compilar” si se está usando una variable previamente declarada o no. Entonces si expresamos ciertas funciones internas como closure en vez de expresarlas como clases, podremos tener un entorno más fuertemente tipado y podemos enterarnos de inconsistencias en tiempo de compilación.

Agradezco además la suscripcíon a Yo no sé tampoco

que lejos de explicar Closures, propone una forma de comunicar en donde los que tratamos términos técnicos usemos un lenguaje “inclusivo”…. no metiendo e por todos lados y anulando vocales, sino guardandonos los términos técnicos para nuestro fuero interno y dejando a los demás humanos a entrar a nuestro mundo que no es tan complicado como tratamos de mostrarlo por nuestra falta de habilidad en la docencia.

Deja un comentario