Задать вопрос
@TrainHard

Почему цикл выводит десять раз undefined?

Всем привет!
Столкнулся с такой ситуацией:
for (var i = 0; i < 10; i++) {
  (function() {
    var i = i;
      console.log(i)
  })();
}

Почему выводится 10 раз undefined? Ведь по идее, при каждой итерации в самовызывающейся функции берется извне переменная i и присваивается переменной i, то есть справа - налево (оператор же присваивания имеет ассоциативность справа)
  • Вопрос задан
  • 319 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
In4in
@In4in
°•× JavaScript Developer ^_^ ו°
var i  //Создать переменную i (undefined) в данной области видимости
 = i;  //Затем присвоить ей значение переменной переменной i (которую только что создали - undefined)


И не важно - в замыкании вы так сделали или еще где. У интерпретатора такая логика, и это вполне нормально. А господа выше, почему-то валят все на самовызывающуюся функцию...один ляпнул, другие повторили.

Самый адекватный подход - не использовать одинаковые имена переменных в подобных схемах.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@lega
берется извне переменная i и присваивается переменной i
Там не так, имя "i" захватывается не в момент var, а с начала блока и до конца, тот же результат будет если var i переместить в конец:
for (var i = 0; i < 10; i++) {
  (function() {
      console.log(i);
      var i;
  })();
}

То же самое с именованными функциями, они создаются сразу, а не с точки где опубликованы:
foo();  // вызов
function foo() {console.log('FOO') }  // объявление
Ответ написан
Комментировать
Ivanq
@Ivanq
Знаю php, js, html, css
Здесь используется самовызывающая функция, а для нее механизм замыканий работает по-другому. Она вызывается не в контексте цикла, а в самом корне. Ей попросту не передаются локальные переменные. Если нужно передать, добавьте ей эти переменные как аргументы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы