Задать вопрос
Этот вопрос закрыт для ответов, так как повторяет вопрос Почему поведение let, var в цикле одинаково?
Muranx
@Muranx
кто понял this тот в цирке не смеётся

Почему с let работает а с var нет?

Привет всем !

for(var k=0; k<3; k++){
   setTimeout(function(){
        console.log(k); // 3 , 3 , 3
      }, 500);
};

for(let k=0; k<3; k++){
    setTimeout(function(){
        console.log(k); // 0 , 1 , 2
    }, 500);
};

Скорее всего тема уже избитая , но я до сих пор не разобрался пока не столкнулся с этой проблемой при написании скрипта ! Просьба объяснить ( желательно прям по итерациям ) что тут происходит, и почему во втором случае выводится то, что мы ожидаем , а в первом просто 3 , 3 , 3 ?
  • Вопрос задан
  • 1517 просмотров
Подписаться 2 Простой 6 комментариев
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
У var область видимости функции, на каждой итерации цикла мы имеем дело с одной и той же переменной.
У let - область видимости блока, на каждой итерации цикла новая переменная
Ответ написан
@drawnofmymind
Переменная var – одна на все итерации цикла и видна даже после цикла

С переменной let – всё по-другому.
Каждому повторению цикла соответствует своя независимая переменная let. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.
Ответ написан
Ответы на вопрос 2
@umbarutiba
В первом случае: когда придет время поставь в очередь функцию выводящую в консоль то что будет в переменной к,
Во втором: тоже самое, но для каждой итерации будет создана своя переменная к
Ответ написан
@Shmulhe
Muranx, с var выводит 3,3,3 потому что переменная данном случае глобальная, а SetTimeout() улетает в стек вызовов.

Для проверки можешь вынести let за пределы блока и убедиться что в таком случае отработает как и с var все. То есть так:
let k = 0;
for(; k < 3; k++) {
    setTimeout(function() {
        console.log(k);
    }, 500);
};
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы