> Как исправить проблему с var в цикле с setTimeout в JavaScript (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: Aston

Стек: JavaScript

> Пример ответа

Проблема возникает из-за того, что var имеет функциональную, а не блочную область видимости. В цикле for (var i = 0; i < 5; i++) переменная i одна на все итерации, и к моменту выполнения setTimeout (асинхронного колбэка) цикл уже завершится, оставив i равным конечному значению (например, 5). Все колбэки увидят одно и то же значение.

Исправление:

  1. Заменить var на let (рекомендуемый современный подход). let создаёт новую привязку переменной для каждой итерации цикла, поэтому каждый setTimeout получит своё значение i:

    JAVASCRIPT
    for (let i = 0; i < 5; i++) {
    setTimeout(() => console.log(i), i * 1000); // 0, 1, 2, 3, 4
    }
  2. Использовать замыкание с немедленно вызываемой функцией (IIFE) - если нужно сохранить var или работать в старом коде:

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

    Здесь j - локальная переменная внутри IIFE, которая фиксирует текущее значение i.

  3. Использовать setTimeout с дополнительным аргументом (третий параметр передаётся в колбэк):

    JAVASCRIPT
    for (var i = 0; i < 5; i++) {
    setTimeout((j) => console.log(j), i * 1000, i);
    }

Все три способа гарантируют, что каждый вызов setTimeout получит правильное значение счётчика.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью