Blog

¿Qué son los Closures?

Mar 05, 2009 | Español | By Crysfel | 11 Comments | Read in English

Mediante los closures podemos resolver varios problemas cuando desarrollamos componentes o alguna aplicación, es importante conocer este concepto aplicado a JavaScript.

¿Qué son los Closures?
Author: Crysfel

I'm a software developer with 6+ years of experience, when I'm not developing software I may be writing a tutorial, you can follow me on twitter

Un closure es la manera en como una función dentro de otra función contenedora puede hacer referencia a las variables después de que la función contenedora ha terminado de ejecutarse. Este concepto puede ser un poco difícil de comprender y de explicar así que veamos un ejemplo.

function sayHi(seconds){
	var hi = 'Hi folks!';

	setTimeout(function(){
		console.info(hi); //Referenciando a la variable ‘hi’
	},seconds*1000);
}

sayHi(2);

En el ejemplo anterior se puede ver claramente como la función “sayHi” termina su ejecución y después de 1 segundo se ejecuta la función interna mostrando el mensaje contenido en la variable “hi”, la cual pertenece a la función contenedora, a esto se le llama closure.

Ocultar variables globales

Muchas veces declaramos variables en el “global scope”, es una mala práctica hacer esto por que estas variables pueden interferir con algunas librerías o con el código de algún otro miembro de nuestro equipo. Si utilizamos una función anónima auto ejecutable y hacemos uso de closures podemos resolver de una manera sencilla este problema. A continuación se muestra como hacer esto:

(function(args){
	var thisWasGlobal = 'closure!';

	window.onload = function(){
		console.info(thisWasGlobal);
	}

})();

El código anterior encapsula las variables declaradas dentro de la función anónima, de esta manera las variables estarán en un scope donde no hay peligro que sobre escriban a otras variables.

Closures y Scope

Se ha mostrado que un closure permite referenciar variables que existen y pertenecen a la función contenedora. Es importante mencionar que al hacer un closure, éste toma el último valor de la variable de la función contenedora. Un caso muy común es cuando utilizamos un ciclo o loop.

window.onload = function(){
	var el = document.getElementById('element');
	var events = ['click','mouseover','mouseout'];

	for(var i=0;i<events.length;i++){
		var item = events[i];
		el['on'+item] = function(){
			console.info('event: '+item);
		}
	}
}

Al ejecutar el código anterior se agregan los eventos contenidos en el arreglo “events” al elemento seleccionado, el problema se ocasiona cuando se imprime en la consola el evento que se ejecuta pues siempre imprime lo mismo, en este caso “mouseout”, esto sucede porque la variable “item” contiene a “mouseout” como último valor asignado.

Para solucionar este problema es necesario crear un scope diferente para cada iteración del ciclo, de esta manera se crearán variables diferentes; esto se realiza mediante una función anónima que se auto ejecute. Si tienes alguna duda en cuanto al concepto scope te recomiendo ver el tema anterior. El código quedaría de la siguiente manera.

window.onload = function(){
	var el = document.getElementById('element');
	var events = ['click','mouseover','mouseout'];

	for(var i=0;i<events.length;i++){
		(function(){ //función anónima crea un nuevo scope
			var item = events[i]; //item pertenece a la function anónima
			el['on'+item] = function(){
				console.info('event: '+item); //un closure de la función anónima
			}
		})();
	}
}

Si ejecutamos el código anterior veremos que ahora el evento correcto se imprime en la consola.

Conclusiones

En este tema vimos que es un closure y cuán útil es cuando introducimos el concepto de scope, esto es algo que debemos aprender y tener en cuenta a la hora de desarrollar nuestros proyectos.

El tema de closures es complicado, te recomiendo darle una leída a “JavaScript Closures” escrito por Jim Jey, es un excelente material que debes leer.

Como siempre puedes dejar tus dudas o sugerencias en los comentarios, y no olvides de votar en tu red social preferida.

11 Responses to “¿Qué son los Closures?”

  • Crespo Mar 24, 2009

    Muchas Gracias por todo este curso.. te felicito, de primerísima calidad

  • Giovani Generali Apr 25, 2009

    Hola, quiero felicitar al curso. Es muy útil y bien explicado, espero el próximo.

  • Franco May 04, 2009

    hola una pregunta en que momento en una aplicacion real me serviria usar un clousure?

    • Crysfel May 05, 2009

      Tiene muchos usos, estoy seguro que has utilizado esta técnica mas de una vez solo que no sabías que tenía nombre :o un ejemplo es para crear botones dinámicamente, para crear propiedades privadas dentro de un objeto, para crear timeouts, etc…

      saludos

  • duvan1124 Aug 25, 2009

    Excelente videotutorial… en serio felicitaciones…

  • Dremmon Aug 28, 2009

    Saludos, felicitaciones por este excelente curso, descubri Ext JS de casualidad buscando Grids + Ajax y ahora estoy aprendiendo como usar esta herramienta tan util y amigable.

    Bueno amigo, un saludo, por tu acento creo que eres de Mexico, por aqui te escribo desde Venezuela,

    Espero sigas con los videoTutoriales, son mas practicos y comprensibles.

  • ilen Nov 18, 2009

    mmmmmm…. muy bueno siguiree aprendiendo espero q despues hagamos una mini aplicacion extjs+php

  • Bachsmann Feb 24, 2010

    jejeje me costo un poco entenderlo..
    pero lo logreeeee
    de verdad que es util!!
    gracias Crys

    • Crysfel Feb 25, 2010

      Si, la verdad es un tema complicado pero creo que vale la pena entenderlo.

  • jose Jul 22, 2010

    hola

    una pregunta tu le das escucha al elemento cuando escribis el['on'+item] =…….. pues es que no entiendo bien como el elemento se da cuenta de cada interaccion

    gracias.

    • Crysfel Jul 23, 2010

      El navegador es el responsable de avisarnos cuando sucede algo con el elemento, tu unicamente necesitas registrar un listener a determinado evento.

      Saludos

Leave a Reply







Updates

RSS

Subscribe to our feeds to receive updates of our newest posts and free tutorials.

Site search

Maybe we have what you need, would you like to search first?

Donations

Would you buy me a cup of coffee? I am sharing my knowledge and time with you, help this project grow. Thank you!