Недавно мне показалось, что мне нужно создать массив функций. Функции используют значения из XML-документа, и я запускаю соответствующие узлы с циклом for. Однако после этого я обнаружил, что только все последние узлы листа XML (соответствующие последнему прогону цикла for) всегда использовались всеми функциями в массиве.
Ниже приведен пример, демонстрирующий это:
var numArr = [];
var funArr = [];
for(var i = 0; i < 10; ++i){
numArr[numArr.length] = i;
funArr[funArr.length] = function(){ return i; };
}
window.alert("Num: " + numArr[5] + "\nFun: " + funArr[5]());
Выход: Num: 5 и Fun: 10.
После исследования я нашел сегмент кода, который работает, но я изо всех сил пытаюсь понять, почему он работает. Я воспроизвел его здесь, используя мой пример:
var funArr2 = [];
for(var i = 0; i < 10; ++i)
funArr2[funArr2.length] = (function(i){ return function(){ return i;}})(i);
window.alert("Fun 2: " + funArr2[5]());
Я знаю, что это связано с определением области обзора, но на первый взгляд кажется, что он не будет отличаться от моего наивного подхода. Я как-то новичок в Javascript, поэтому, если я могу спросить, почему использование этой функции-возвращаемой функции исключает проблему обзора? Кроме того, почему (i) включен в конце?
Заранее большое спасибо.