Estoy leyendo "Javascript: The Good Parts" y estoy totalmente desconcertado por lo que realmente está pasando aquí. Una explicación más detallada y/o simplificada sería muy apreciada.Cierres: ¿Explicación de línea por línea del ejemplo "Javascript: buenas piezas"?
// BAD EXAMPLE
// Make a function that assigns event handler functions to an array of nodes the wrong way.
// When you click on a node, an alert box is supposed to display the ordinal of the node.
// But it always displays the number of nodes instead.
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (e) {
alert(i);
}
}
};
// END BAD EXAMPLE
La función add_the_handlers
se pretende dar a cada controlador de un número único (i). Se produce un error debido a que las funciones de controlador están ligados a la variable i
, no el valor de la variable i
en el momento en que se hizo la función:
// BETTER EXAMPLE
// Make a function that assigns event handler functions to an array of nodes the right way.
// When you click on a node, an alert box will display the ordinal of the node.
var add_the_handlers = function (nodes) {
var i;
for (i = 0; i < nodes.length; i += 1) {
nodes[i].onclick = function (i) {
return function (e) {
alert(i);
};
}(i);
}
};
Ahora, en lugar de asignar una función a onclick, definimos una función y Invocarlo de inmediato, pasando en i
. Esa función devolverá una función de controlador de eventos que está vinculada al valor de i
que se transfirió, no al i
definido en add_the_handlers
. Esa función devuelta se asigna a onclick.
Ver las preguntas etiquetadas en: http://stackoverflow.com/questions/tagged/javascript+closures+loops – CMS
Usted también puede jugar con una demostración en vivo http://jsbin.com/sezisalulede/1/edit?html,js,output –