Короткий ответ
Внешняя функция держит переменные; наружу отдаёт методы, которые их замыкают. Снаружи прямого доступа к этим переменным нет.
Подробности
function createCounter() {
let count = 0;
return {
increment() {
count++;
return count;
},
decrement() {
count--;
return count;
},
getCount() {
return count;
},
};
}
const counter = createCounter();
console.log(counter.increment());
console.log(counter.count);
Альтернативы: #private поля классов, модульный scope.
Итог
Замыкание инкапсулирует состояние: доступ только через возвращённый API.