Показать сообщение отдельно
  #31 (permalink)  
Старый 04.09.2012, 02:18
Аватар для Kivi
Интересующийся
Отправить личное сообщение для Kivi Посмотреть профиль Найти все сообщения от Kivi
 
Регистрация: 30.08.2012
Сообщений: 15

Опять хрень!!! Только, кажется, уже все - разобрался и опять...
Здесь (на 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.


Моё объяснение (по методу прогиба подреальность):
скрипт прошел - все ссылки определились, и не смотря, что в сценарии вывод идет параллельно циклу, на самом деле все не так - вывод в консоль идет в конце.
Вопрос:
Где почитать когда события по коду идут "одновременно" а когда "по-особенному"?
Ответить с цитированием