@TrainHard

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

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

Почему выводится 10 раз undefined? Ведь по идее, при каждой итерации в самовызывающейся функции берется извне переменная i и присваивается переменной i, то есть справа - налево (оператор же присваивания имеет ассоциативность справа)
  • Вопрос задан
  • 318 просмотров
Решения вопроса 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
Здесь используется самовызывающая функция, а для нее механизм замыканий работает по-другому. Она вызывается не в контексте цикла, а в самом корне. Ей попросту не передаются локальные переменные. Если нужно передать, добавьте ей эти переменные как аргументы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект
22 нояб. 2024, в 03:54
1500 руб./за проект