Что такое замыкание
Вопрос
Объясни, что такое замыкание. Как коллеге, который спросил на код-ревью.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
функция вместе с лексическим окружением, в котором она создана
окружение определяется местом объявления, а не местом вызова
переменные внешней функции живут, пока жива внутренняя
практика: приватное состояние, счётчики, debounce/throttle, каррирование
утечка: замыкание держит в памяти весь объект, даже если нужно одно поле
Что могут спросить следом
- А что выведет цикл с var и setTimeout и почему
- Чем замыкание отличается от объекта с полем
- Как замыкание может дать утечку памяти
Разбор
Замыкание - это функция вместе с тем лексическим окружением, где она была объявлена. Связь с окружением создаётся в момент создания функции, а не вызова: поэтому вложенная функция видит переменные внешней даже после того, как внешняя завершилась.
function counter() {
let n = 0; // живёт, пока жива inc
return function inc() { return ++n; };
}
На практике это приватное состояние без классов, накопители в debounce/throttle,
каррирование и мемоизация. Обратная сторона - утечки: если замкнуть тяжёлый объект ради
одного поля, в памяти останется весь объект.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.