Un cierre es básicamente una función B anidado dentro de una función A que se puede acceder a las variables locales de A:
function A() {
var x = 5;
function B() {
print(x);
}
return B;
}
Si usted viene de un fondo de C++, esto es bastante difícil de digerir. Cuando intentemos llamar a la función devuelta por A, ¿a qué se referirá x
? ¿No será eso x
inválido ya que A()
terminó?
La respuesta es que en realidad vive en x
. Que B
volvimos realmente lleva x
implícitamente. Genial, ¿eh?
En un sentido más general, un cierre es una función unida a algunos datos. En un lenguaje sin cierres como C, cada programa tiene un número fijo de funciones. Con cierres, puede, en cierto sentido, "crear funciones" vinculándolos con datos dinámicos. Por supuesto, nadie te impide emular cierres en C, pero a veces puede ser doloroso.
Los cierres son realmente útiles. Por ejemplo, supongamos que queremos aplicar nuestro propio "bucle":
function loop(count, f) {
for (var i = 0; i < count; i++)
f(i);
}
var array = [0,1,2,3,4];
loop(5, function(i) {
print(array[i]);
});
que se le permita acceder a las variables externas sin hacer un montón de tonterías adicional mantiene buen código y sencilla. Sin cierres, es posible que tenga que pasar una variable de contexto a la función loop
lugar:
function loop(count, f, ctx) {
for (var i = 0; i < count; i++)
f(i, ctx);
}
var array = [0,1,2,3,4];
loop(5, function(i, ctx) {
print(ctx[i]);
}, array);
Otro ejemplo: supongamos que queremos registrar una devolución de llamada en jQuery, pero puede ser ejecutado poco después de la función y su persona que llama y persona que llama de la persona que llama se termina la ejecución:
$(document).ready(function(){
var clicked = 0;
$('#button').click(function(){
clicked++;
alert("You've pressed the button " + clicked + " times.");
});
});
Si JavaScript fueron más como C++ (antes C++ 0x), que clicked
variable se larga ido a la vez la función dada a $(document).ready()
se llamaba, y el botón de clic la devolución de llamada tendría un comportamiento indefinido.
Preguntas http://stackoverflow.com/questions/36636/what-is-a-closure y http://stackoverflow.com/questions/1095707/what-is-the-exact-definition-of-a- el cierre es similar a este –