Опять хрень!!! Только, кажется, уже все - разобрался и опять...
Здесь (на http://learn.javascript.ru Использование замыканий есть пример:
function makeArmy() {
var shooters = [];
for(var i=0; i<10; i++) {
var shooter = function() { // функция-стрелок
alert(i); // выводит свой номер
};
shooters.push(shooter);
}
return shooters;
}
var army = makeArmy();
army[0](); // стрелок выводит 10, а должен 0
army[5](); // стрелок выводит 10...
// .. все стрелки выводят 10 вместо 0,1,2...9
ну и объяснение
К моменту вызова army[0](), функция makeArmy уже закончила работу. Цикл завершился, последнее значение было i=10.
Все понятно.
А вот
чуть ниже чем тут. Еще пример:
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}
и тоже объясняется:
Данный код не будет выводить числа с 0 до 9, вместо этого число 10 будет выведено десять раз.
Анонимная функция сохраняет ссылку на i и когда будет вызвана функция console.log, цикл for уже закончит свою работу, а в i будет содержаться 10.
Моё объяснение (по методу прогиба подреальность):
скрипт прошел - все ссылки определились, и не смотря, что в сценарии вывод идет параллельно циклу, на самом деле все не так - вывод в консоль идет в конце.
Вопрос:
Где почитать когда события по коду идут "одновременно" а когда "по-особенному"?