Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

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

Как замыкания работают внутри циклов?

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

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

Замыкание — это функция, которая запоминает свою внешнюю область видимости. В цикле с var переменная i общая для всех итераций, поэтому после завершения цикла все замыкания увидят последнее значение i. Использование let создаёт новую переменную на каждой итерации, решая проблему. Также можно использовать IIFE или bind.

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

Что такое замыкание и как оно работает в цикле

Замыкание — это функция, которая сохраняет ссылку на переменные из внешней области видимости, даже после того, как эта область завершила выполнение. В JavaScript это особенно важно при работе с циклами, где создаются функции внутри итераций.

Проблема с var

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

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

Решение с let

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

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

Альтернативные решения

  • IIFE (Immediately Invoked Function Expression): создаёт новую область видимости на каждой итерации, передавая текущее значение i как аргумент.
  • Метод bind: привязывает значение i к функции.
for (var i = 0; i < 3; i++) {
  setTimeout(console.log.bind(console, i), 100);
}
// Вывод: 0, 1, 2

Вывод

Понимание замыканий в циклах необходимо для написания предсказуемого асинхронного кода. Используйте let или IIFE, чтобы избежать ошибок, связанных с общим состоянием переменной.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    4

Навыки

  • JavaScript

    JavaScript

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

#closure

#loop

#JavaScript

#scope

#var

#let

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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