Я читаю «Javascript: The Good Parts» и полностью озадачен тем, что действительно происходит здесь. Было бы весьма полезно получить более подробное и/или упрощенное объяснение.Закрытие: пояснение по строке «Пример Javascript: Good Parts»?
// 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
add_the_handlers
функция была предназначена, чтобы дать каждому обработчику уникальный номер (I). Это не удается, так как функции обработчика связаны с переменной i
, а не значение переменной i
в то время функция была сделана:
// 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);
}
};
Теперь, вместо того, чтобы назначить функцию OnClick, мы определим функцию и немедленно вызовите его, переходя в i
. Эта функция возвращает функцию обработчика событий, которая привязана к значению i
, которое было передано, а не к i
, определенному в add_the_handlers
. Возвращаемой функции присваивается onclick.
Смотрите вопросы маркированные в: http://stackoverflow.com/questions/tagged/javascript+closures+loops – CMS
Вы также можно поиграть с демо-версией http://jsbin.com/sezisalulede/1/edit?html,js,output –