Почему при первом вызове выводится 0: это связано с замыканием или с постфиксным инкрементом?

Частая причина, почему функция с замыканием всегда выводит 0, а не инкрементированное значение — это неправильное использование переменных в цикле с асинхронными вызовами или отложенным выполнением.

Короткий ответ

Что ответить на собеседовании

Частая причина, почему функция с замыканием всегда выводит 0, а не инкрементированное значение — это неправильное использование переменных в цикле с асинхронными вызовами или отложенным выполнением.

Подробный разбор

Ответ с пояснениями

Частая причина, почему функция с замыканием всегда выводит 0, а не инкрементированное значение — это неправильное использование переменных в цикле с асинхронными вызовами или отложенным выполнением.

Например, если внутри цикла объявлена переменная с var, то она имеет функциональную область видимости, и все замыкания будут ссылаться на одну и ту же переменную, которая к моменту вызова равна 0.

Пример на JavaScript:

for (var i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i); // всегда 3, а не 0,1,2
  }, 100);
}

Чтобы исправить, нужно использовать let, который имеет блочную область видимости, или создавать дополнительное замыкание:

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

Или с замыканием:

for (var i = 0; i < 3; i++) {
  (function(j) {
    setTimeout(function() {
      console.log(j); // 0,1,2
    }, 100);
  })(i);
}

Таким образом, проблема в том, что замыкание захватывает переменную, а не её значение в момент создания функции.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку