Короткий ответ
Замыкание — функция вместе с лексическим окружением, в котором она была создана. Даже после выхода из внешней функции внутренняя «помнит» доступные переменные.
function makeCounter ( ) {
let count = 0 ;
return function ( ) {
return ++count;
};
}
const c = makeCounter ();
c ();
c ();
Где встречается каждый день
обработчики событий и колбэки;
фабрики функций / partial application;
модули и инкапсуляция («приватные» переменные);
хуки и middleware.
function bindGreeting (name ) {
return () => `Hello, ${name} ` ;
}
Типичные ловушки
Замыкание на var в цикле (одна переменная на всех) — лечится let или IIFE.
Память: замыкание удерживает ссылки на замкнутые объекты — возможны утечки, если держать большие структуры без нужды.
Формулировка для собеса
Closure = function + [[Environment]]. Позволяет инкапсулировать состояние и создавать функции «с контекстом».