Рони, Ruslan_xDD, спасибо! С этим (i) разобрался - оказывается, так можно вызывать функцию. Но почитал на learn.javascript про замыкание, про порядок обработки кода и инициализации. Примеры же там, конечно, даются простенькие совсем, например, когда переменная инициализируется ДО выполнения какой-то функции и потом ей же присваивается другое значение. Тогда всё понятно - значение берётся текущее. Но ведь также сказано, что на этапе запуска происходит поиск и подготовка всех Function Declaration и всех переменных, которые становятся undefined. А вот потом, уже когда код выполняется, идёт присваивание:
var phrase = 'Привет';
function sayHi(name) {
alert(phrase + ', ' + name);
}
sayHi('Вася'); // Привет, Вася (*)
phrase = 'Пока';
sayHi('Вася'); // Пока, Вася (**)
Здесь всё предельно ясно: перед запуском подготовлена sayHi(name); и 2 переменные: name и phrase, которые undefined. Когда функция запущена, происходит присвоение name = 'Вася'; а дальше ищется phrase, которая, находясь раньше функции, получает значение 'Привет'. Соответственно, когда функция вызвана второй раз, то "ближайшей" к ней phrase будет уже вторая, с 'Пока' поэтому результат её изменится.
Дальше возвращаемся к "ошибочному примеру". Там функция такова:
function addEvents(divs) {
for(var i=0; i<divs.length; i++) {
divs[i].innerHTML = i
divs[i].onclick = function() { alert(i) }
}
}
Т.е. присвоение i значений же происходит последовательно, по мере того, как крутится цикл! Почему же тогда говорится, что "обработчик onclick активизируется, когда цикл закончен и i == 10;"?? Ведь
divs[i].onclick = function() { alert(i) }
расположен ВНУТРИ этого цикла, а не ЗА его пределами ниже! Почему тогда он берёт не текущую i, а финальную сразу? Или это свойство обработчика - активизироваться только после того, как отработает цикл, несмотря на то, что сам он находится внутри?