Aprendiendo Ext JS 3

¿Qué son los Closures? Más videos

Descripción del tema

Mediante los closures podemos resolver varios problemas cuando desarrollamos componentes o alguna aplicación, es importante conocer este concepto aplicado a JavaScript. 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.

Te gustaría recibir más tutoriales como este en tu correo?

Este tutorial pertenece al curso Aprendiendo Ext JS 3, te recomiendo revises el resto de los tutoriales ya que están en secuencia de menor a mayor complejidad.

Si deseas recibir más tutoriales como este en tu correo te recomiendo registrarte al curso, si ya eres miembro solo identifícate y registrate al curso, si no eres miembro te puedes registrar gratuitamente!

Si no gustas registrarte en este momento no es necesario! Aún así puedes recibir los nuevos tutoriales en tu correo! Jamás te enviaremos Spam y puedes cancelar tu suscripción en cualquier momento.

¿Olvidaste tu contraseña?

18Comentarios

  • Avatar-9 Crespo 25/03/2009

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

    • Avatar-8 Giovani Generali 26/04/2009

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

      • Avatar-9 Franco 04/05/2009

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

        • Avatar-3 Crysfel 05/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

          • Avatar-11 duvan1124 25/08/2009

            Excelente videotutorial... en serio felicitaciones...

            • Avatar-4 Dremmon 28/08/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.

              • Avatar-10 ilen 18/11/2009

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

                • Avatar-7 Bachsmann 24/02/2010

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

                  • Avatar-5 Crysfel 25/02/2010

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

                    • Avatar-12 jose 22/07/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.

                      • Avatar-4 Crysfel 23/07/2010

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

                        • Avatar-11 Hector Rubio 03/10/2010

                          Excelente, voy entendiendo paso a paso, me gustaria profundiar mas en este estilo de desarrollo

                          • Avatar-9 Geis 02/12/2010

                            Hola Crysfel excelentes estos vídeotutoríales pero tengo algo que no entiendo en la parte de el['on'+item]; o sea por lo que entiendo al ponerle un evento a un elemento primero uno coloca el evento igual la funcion que va a tener la accion, y dentro de la funcion el elemento igual a lo que haría, que en este caso deberia ser; llamar la funcion interna que es la que imprime el evento que se esta ejcutando.si estoy mal en todo caso podrias explicarme como llama esta parte , que se ejecute sobre ese elemento los eventos no se si me hice netender

                            • Avatar-2 manu 18/08/2011

                              Hola, Primeramente Felicitarte. Explicas muy bien. Por otra parte hay temas que no tienen el material de apoyo. Como es el caso. Un saludo.

                              • Avatar-12 Sergio 29/11/2011

                                Está excelente el tutorial, de verdad muy bueno! Gracias!

                                • Avatar-9 cristian 21/05/2012

                                  La explicacion de closures más práctica que encontre, lo haces simple, felicitaciones.

                                  • Avatar-11 John Sánchez Alvarez 13/06/2012

                                    Buen artículo, La explicación es clara y sencilla para empezar a dominar este tema. Muchas gracias por tú aporte.

                                    • Avatar-11 Tapion 28/08/2012

                                      Amigo muchas gracias, me has salvado la vida, mil y mil gracias

                                      Instructor del curso

                                      Crysfel3

                                      Autor: Crysfel Villa

                                      Es ingeniero de software con más de 7 años de experiencia en desarrollo web.

                                      Descarga Código Fuente

                                      Regístrate a este curso

                                      Este tutorial pertenece al curso Aprendiendo Ext JS 3, revisa todos los tutoriales que tenemos en este mismo curso ya que están en secuencia y van de lo más sencillo a lo más complicado.

                                      Tendrás acceso a descargar los videos, códigos y material adicional.

                                      Podrás resolver los ejercicios incluidos en el curso así como los Quizzes.

                                      Llevarás un registro de tu avance.