ENIGMA AI
ENIGMA AI

Почему этот код не работает?

встречается 2× junior general

Как ответить

Скорее всего, вы столкнулись с классической проблемой замыканий в JavaScript, когда переменная объявлена через var внутри цикла. Код примерно такой:

for (var i = 0; i < 5; i++) {
  setTimeout(() => console.log(i), 100);
}

Он выводит пять раз 5, а не 0,1,2,3,4. Причина — var не создаёт блочную область видимости. Переменная i одна на весь цикл и к моменту выполнения колбэков (через 100 мс) уже равна 5. Все замыкания ссылаются на одну и ту же переменную.

Исправить можно двумя способами. Первый — заменить var на let:

for (let i = 0; i < 5; i++) {
  setTimeout(() => console.log(i), 100);
}

let создаёт новую привязку для каждой итерации, поэтому каждый колбэк запоминает своё значение i. Второй способ — обернуть вызов в IIFE (Immediately Invoked Function Expression) и передать текущее значение как аргумент:

for (var i = 0; i < 5; i++) {
  (function(i) {
    setTimeout(() => console.log(i), 100);
  })(i);
}

Этот приём создаёт новую область видимости для каждой итерации.

На практике на собеседованиях такое спрашивают, чтобы проверить понимание областей видимости, замыканий и асинхронности. Для junior это база: если не знаешь — гугли «JavaScript closure loop» и запомни решение.

Ключевые тезисы

  • Использование var в цикле не создаёт блочную область видимости — все колбэки видят финальное значение i.
  • let создаёт новую привязку на каждой итерации, решая проблему без дополнительных конструкций.
  • IIFE — классический обходной путь для ES5, где не было let/const.
  • Понимание этой проблемы демонстрирует знание замыканий и event loop.
  • В реальном коде лучше сразу использовать let/const, избегая var в современных проектах.

Что спросят дальше

  • — Как бы вы переписали этот код без let и IIFE, используя только var?
  • — Что такое замыкание и как оно связано с асинхронными вызовами?
  • — В каком порядке выполнятся console.log, если заменить var на let и убрать setTimeout?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение