Digamos que usted desea una función que se puede utilizar para devolver un valor único "id" para usar al crear nuevos elementos DOM . Ahora, en algo como Java, podrías crear una clase con un contador privado interno, y luego tener un método que agregue el contador a alguna cadena de prefijo. Bueno, en Javascript:
var getId = (function() {
var counter = 0;
return function() {
return "prefix" + counter++;
};
})();
Ahora la variable "getId" está destinada a una función que es creado por otra función, y creó de tal manera que tiene una variable persistente para utilizar entre invocaciones. Del mismo modo, si quería tener una familia de funciones "getId" (digamos, una para cada tipo de elemento DOM podría añadir), que podría hacer esto:
var getIdFunc = function(prefix) {
var counter = 0;
return function() {
return prefix + counter++;
};
};
var getId = {
'div': getIdFunc('div'),
'span': getIdFunc('span'),
'dl': getIdFunc('dl'),
// ...
};
Ahora puede llamar getId.div()
para obtener una nueva valor "id" para un nuevo <div>
. La función se creó llamando a una función que proporciona dos valores escondidos en un cierre: la cadena de prefijo (pasada como un argumento) y el contador (un var
declarado en el ámbito de cierre).
Una vez que se acostumbre, la instalación es tan flexible y útil que sentirá dolor al regresar a un entorno sin ella.
Ah, y he aquí un consejo para ayudarle a mantenerse fuera Stackoverflow debe probar esto: se trata de un problema que aparece todo el tiempo:
for (var i = 0; i < 10; ++i) {
var id = "foo" + i;
var element = document.getElementById(id);
element.onclick = function() {
alert("hello from element " + i);
};
}
Cuál es el problema aquí? Bueno, esa variable "i" a la que hace referencia esa función es la "i" del alcance en el que se ejecuta ese bucle. Esa variable, notarás, se incrementa a través del ciclo (duhh, ¿verdad?). Bueno, cada una de esas pequeñas funciones creadas y asignadas como manejadores de eventos será que comparta con la misma variable única "i" en el ámbito de cierre. Oops! La solución es hacer algo como esto:
for (var i = 0; i < 10; ++i) {
var id = "foo" + i;
var element = document.getElementById(id);
element.onclick = (function(iCopy) {
return function() {
alert("hello from element " + iCopy);
};
})(i);
}
Hacemos una copia del exterior "i" en un ámbito de cierre de su cuenta, por lo que ahora cada controlador de eventos tiene su propio!
En resumen: la técnica de aprovechar cierres surge todo el tiempo maldito una vez que te acostumbras. No es un boleto gratis a un nuevo país de las maravillas de la programación libre de errores; no me malinterpretes Sin embargo, es un paradigma muy útil y flexible.
contador ejemplo es clásico :). – Anshul