español - Confundido por los cierres en JavaScript
javascript pdf (3)
Posible duplicado:
¿Cómo funcionan los cierres de JavaScript?
¿Javascript cierres y efectos secundarios en inglés simple? (por separado)
Soy nuevo en JavaScript pero estoy realmente confundido por cómo funcionan los cierres. ¿Puede alguien explicar en términos sencillos qué son o por qué son útiles?
Los cierres son algo así como el contexto de una función cuando se define. Cada vez que se define una función, el contexto se almacena, e incluso si se termina el ciclo de vida "normal" de su función, si mantiene una referencia a un elemento definido dentro de la ejecución de su función, todavía puede acceder a elementos del contexto cierre), que es en realidad el alcance de su función en su definición. Lo siento por mi mal inglés, pero probablemente este ejemplo te haga entender:
function test() {
var a = "hello world";
var checkValue = function() { alert(a); };
checkValue();
a = "hi again";
return checkValue;
}
var pointerToCheckValue = test(); //it will print "hello world" and a closure will be created with the context where the checkValue function was defined.
pointerToCheckValue(); //it will execute the function checkValue with the context (closure) used when it was defined, so it still has access to the "a" variable
Espero eso ayude :-)
Recomiendo encarecidamente el siguiente article . Me pareció un gran punto de partida para comprender los cierres.
Si empiezas con un uso simple, que obtuve de http://ejohn.org/apps/learn/#49
var num = 10;
function addNum(myNum){
return num + myNum;
}
assert( addNum(5) == 15, "Add two numbers together, one from a closure." );
Lo que está sucediendo es que la variable num
está atrapada (encerrada) dentro de la función addNum
.
Donde esto se vuelve práctico es si tiene algo (no se espera que se ejecute correctamente) como esto:
for(var t = 0; t < 5; t++) {
var elem = document.getElementById(''mydiv'' + t);
elem.onclick = function(e) {
alert(t);
};
};
Esto debería mostrar el valor 5 para cada div que se estableció con este controlador de eventos.
Si encierra esa instancia del contador dentro de su controlador de eventos, puede ser diferente para cada uno, que es el comportamiento esperado.
Este es un tema bastante avanzado. Una vez que se sienta más cómodo con javascript es posible que desee ver cómo lo aprendió en ese momento.