2013-08-03 2 views
0

Я в настоящее время обучения JavaScript из следующей книги «JavaScript: The Good Parts - O'Reilly Media», в котором говорится следующее:Javascript Закрытие С массивом Узлов

Важно понимать, что внутренняя функция имеет доступ к реальным переменным внешних функций и не копии для того, чтобы избежать следующей проблемы:

// 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 

Вопрос: Я не понимаю, в чем проблема, если кто-то может дать мне четкий пример с цифрами и результаты, которые будут очень оценены.

+0

Возможный дубликат [Закрытие Javascript внутри петель - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) –

+0

Независимо от того, какой узел вы нажимаете on, он будет предупреждать одно и то же значение, равное количеству узлов, в которые вы проходили. См. также http://stackoverflow.com/questions/2568966/how-do-i-pass-the-value-not-the-reference -of-a-js-variable-to-a-function и http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – DCoder

+0

@AnttiHaapala приятно! тот же обман, через несколько секунд после вас, не увидев ваш голос. –

ответ

0

Проблема в том, что функция, которую вы передаете onclick, содержит ссылку на тот же i, который увеличивается при каждом повороте цикла. Таким образом, когда щелчок запускается, я увеличился в соответствии с количеством элементов.

2

Значение i изменяется каждый раз, когда цикл увеличивается, а обработчики событий будут предупреждать о текущем значении i. Поэтому, если имеется 8 элементов, все они будут выставлять значение 7, когда цикл выполняется.

Пункт примера состоит в том, что многие люди предполагают, что когда каждый обработчик первоначально связан с текущим значением i (например, 0, 1, 2 и т. Д.), Он тогда не изменяется, так как увеличивается i. Этот пример демонстрирует, что это не так, и что функции обработчика событий всегда имеют доступ к текущему значению i, даже после привязки.

Смежные вопросы