Что такое замыкание?
Функции
Замыкание (closure) — это функция вместе с её лексическим окружением: она сохраняет доступ к переменным внешней функции даже после того, как та завершила работу.
Почему это работает
В JavaScript функция «запоминает», где она была объявлена, а не откуда её вызвали. Ссылка на внешнее лексическое окружение сохраняется, поэтому переменные не удаляются сборщиком мусора, пока на них ссылается внутренняя функция.
function makeCounter() {
let count = 0;
return function () {
return ++count;
};
}
const counter = makeCounter();
counter(); // 1
counter(); // 2count живёт в замыкании и сохраняется между вызовами.
Где применяют
- Приватные данные — эмуляция private-полей до появления
#-полей в классах. - Фабрики функций — каррирование, конфигурируемые обработчики.
- Мемоизация — кеш хранится в замыкании.
- Колбэки и обработчики — сохраняют нужный контекст данных.
Частая ошибка с циклом
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 3, 3, 3
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 0, 1, 2
}var один на весь цикл, а let создаёт новую переменную на каждой итерации — и замыкание захватывает свою.
Коротко для собеседования
Замыкание — функция, которая помнит переменные из места своего объявления. Позволяет хранить состояние между вызовами и делать приватные данные.
Подробнее: learn.javascript.ru — Замыкание, MDN — Closures