Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: closure, scope, var, let, event loop

Почему возникает проблема с использованием переменной цикла внутри функций?

Вопрос проверяет понимание замыканий и области видимости переменных в JavaScript, что важно для написания корректного асинхронного кода.

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

Проблема возникает из-за того, что переменная цикла, объявленная через var, имеет функциональную область видимости. Все функции, созданные внутри цикла, ссылаются на одну и ту же переменную, которая после завершения цикла принимает последнее значение. Использование let или замыкания с немедленно вызываемой функцией решает эту проблему.

Длинный ответ

Проблема с переменной цикла в замыканиях

Когда вы создаете функции внутри цикла и используете переменную цикла (например, i), эти функции запоминают не значение переменной на момент создания, а ссылку на саму переменную. Если переменная объявлена через var, она имеет функциональную область видимости, и все функции видят одно и то же значение после завершения цикла.

Пример проблемы

for (var i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i); // Выведет 3, 3, 3
  }, 100);
}

Здесь все три функции выполняются после завершения цикла, когда i уже равно 3.

Решение с let

for (let i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i); // Выведет 0, 1, 2
  }, 100);
}

let создает новую переменную для каждой итерации, поэтому каждая функция получает свое значение.

Решение с замыканием

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

Немедленно вызываемая функция создает новую область видимости, копируя текущее значение i в параметр j.

Вывод: Используйте let для переменных цикла, чтобы избежать неожиданного поведения с замыканиями. Если нужно поддерживать старые браузеры, применяйте паттерн с немедленно вызываемой функцией.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    5

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#closure

#scope

#var

#let

#event loop

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию