
Los Clousures es una característica que trae el lenguaje Javascript, muy útil, pero si no tenemos cuidado nuestro código se puede comportar de forma extraña. Básicamente, Clousure es un mecanismo que tiene el lenguaje para «extender» el scope de ciertas variables dentro de un Execution Context.
Pero es más fácil verlo con un ejemplo, suponéte que tenés el siguiente código:
function saludo(elsaludo) { return function (nombre) { console.log(elsaludo+' '+nombre); } } var decirHola = saludo('Hola'); decirHola('Gustavo');
var decirHola = saludo('Hola'); decirHola('Gustavo');

Y ahora, las partes «raras»
Bien, ahora una consulta, para vos ¿qué imprime esto en pantalla?
const arr = [1, 2, 3, 4]; var functions = []; for (var i in arr) { functions.push(function() { console.log(arr[i]); }); } functions[0](); functions[1](); functions[2](); functions[3]();


functions[0]();


Forma 1: usando let
En ECSMAC2015 se incorporó una palabra reservada «let«, que se usa para declarar variables y que su scope esté a nivel de bloque, en este caso nuestro código lo cambiamos por éste otro:
const arr = [1, 2, 3, 4]; for (var i in arr) { let j = i; setTimeout(function() { console.log(arr[j]); }, 1000); }
Forma 2: usando IIFE
Si no sabés lo que es IIFE fijáte en este post. ¡Ahora sí, vamos a sacarle provecho a las IIFE! Por si no lo recordás, una de las características de las IIFE es que se pueden crear scopes dentro de las IIFE, de esta forma se pueden «encerrar» variables en un scope determinado sin que otra parte del código (incluido Clousures) interfiera en nuestro scope.
const arr = [1, 2, 3, 4]; var functions = []; for (var i in arr) { functions.push( (function(j){ return function() { console.log(arr[j]); } })(i) ); } console.log(functions); functions[0](); functions[1](); functions[2](); functions[3]();

Extendiendo el scope de variables, no creando variables nuevas
Como vemos en el caso de estudio anterior, lo que hacen los Clousures no es crear variables nuevas sino usar las variables que ya existen en otros Execution Context. Es por eso que, si alguno de los Execution Context que tenga acceso a una variable «compartida» por otro Execution Context, modifica esa variable, todos los Execution Context verán el cambio.

Conclusiones
Como vimos, los Clousures son un mecanismo para extender el scope de una variable de un Execution Context a otro Execution Context. Como verás, también tiene sus reglas (y muy importantes) que hay que conocer para no encontrarnos con nada raro. Mas allá de eso, es un mecanismo muy potente que es necesario dominar para códigos mas complejos en Javascript.