Я читаю "Javascript: The 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.