Объясните замыкание на примере
Вопрос
Объясните, что такое замыкание, и приведите пример, где вы использовали его на практике.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Определение: функция плюс лексическое окружение, где она создана
Окружение живёт, пока жива функция, даже после завершения внешней
Хранится ссылка на переменную, а не копия значения
Пример: приватный счётчик или фабрика функций
Практика: debounce, мемоизация, обработчики событий, хуки React
Обратная сторона: устаревшие значения и удержание памяти
Что могут спросить следом
- Что выведет цикл с
varиsetTimeout, как исправить безlet? - Что такое stale closure в React и как с ним бороться?
- Может ли замыкание привести к утечке памяти?
Разбор
Образцовый ответ: «Замыкание это функция вместе с окружением, в котором её создали. Когда функция объявляется, она запоминает ссылку на внешние переменные, и пока функция жива, живо и это окружение. Классический пример: createCounter объявляет let count = 0 и возвращает функцию inc, которая увеличивает count. Внешняя функция уже отработала, а inc продолжает менять свой count, и снаружи до него не добраться, то есть получилось приватное состояние. Важно, что замыкание держит ссылку на переменную, а не снимок значения. На практике я сталкиваюсь с замыканиями постоянно: debounce хранит id таймера в замыкании, мемоизация хранит кеш, обработчик клика помнит данные элемента. В React каждый рендер создаёт новые функции, которые замыкают значения своего рендера, и отсюда типичный баг с устаревшим состоянием внутри setInterval. Его лечат функциональным обновлением или правильными зависимостями эффекта. Ещё замыкание может удерживать большие данные в памяти, если обработчик не отписан».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.