Entendiendo closures en JavaScript

Yeison Daza 🍉
Entendiendo JavaScript
3 min readMar 17, 2016

Un closure es cuando una función es capaz de recordar y acceder a un lexical scope, incluso cuando la función es ejecutada por fuera del lexical scope.

Sencillo ¿cierto?, bueno tal vez no tanto, pero vamos paso a paso y entendamos esto.

Nota: Este contenido lo publiqué primero en mi newsletter, la semana después de publicar el newsletter publico en mi blog, si quieres ser el primero en leer suscríbete.

Antes de entender mejor el concepto, deberías conocer:

Los closures son muy utilizados en JavaScript, solo hay que saber reconocerlos dentro del código y las implicaciones de funcionalidad que este tiene.

Los closures están disponibles gracias a que el lenguaje implementa lambdas y funciones de alto orden y son una consecuencia directa de escribir código usando lexical scopes.

veamos esto en código:

Se tiene una función, que tiene una variable interna, que utiliza la variable name y retorna la definición de la función sayName.

Si llamamos la función sin paréntesis estamos pasando el objeto función en sí mismo.

Si llamamos la función con paréntesis pasamos el resultado de su ejecución.

Funciones de alto orden en JavaScript

Pero al ejecutar la función say, cuando se asigna a la variable sayYeison, su variable interna, no debería ser borrada por el Garbage Collector, ya que no está en uso, ¿no?

Esto no es así, ya que al ejecutar la función, se retorna la definición de la función interna que tiene una referencia a este scope, por este motivo la variable no va desaparecer.

El scope interno todavía está en uso, usado por la función que se retorna

Lo fundamental para poder entender el concepto de closure, es que contamos con una contexto y una función que hace uso de este, permitiéndonos acceder al scope de tal contexto.

Veamos en otro ejemplo.

Aplicando closures podemos crear funciones utilizando diferentes contextos, esto nos lleva a un patrón muy poderoso que veremos en el siguiente post.

Por último veamos una aplicación práctica de closures, tomado de JavaScript: The Good Parts (página 60).

Vamos a crear una función para calcular el número Fibonacci

Podemos ver en la ejecución, se llamó 453 veces a la función fibonacci, así con números más grandes esta cantidad crecerá exponencialmente, intentemos mejorar esto aplicando closures.

Utilizando un closure, que nos permita almacenar los resultados en un array, el número de veces que se invoca la función ahora es 29.

Puedes encontrar más referencias a este tema en:

--

--