Ответ вслух Junior Области видимости и замыкания спрашивают часто обновлено

Что такое замыкание

Вопрос

Объясни, что такое замыкание. Как коллеге, который спросил на код-ревью.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Замыкание - это функция вместе с тем лексическим окружением, где она была объявлена. Связь с окружением создаётся в момент создания функции, а не вызова: поэтому вложенная функция видит переменные внешней даже после того, как внешняя завершилась.

Что должно прозвучать в ответе

  • функция вместе с лексическим окружением, в котором она создана

  • окружение определяется местом объявления, а не местом вызова

  • переменные внешней функции живут, пока жива внутренняя

  • практика: приватное состояние, счётчики, debounce/throttle, каррирование

  • утечка: замыкание держит в памяти весь объект, даже если нужно одно поле

Что могут спросить следом

  • А что выведет цикл с var и setTimeout и почему
  • Чем замыкание отличается от объекта с полем
  • Как замыкание может дать утечку памяти

Разбор

Замыкание - это функция вместе с тем лексическим окружением, где она была объявлена. Связь с окружением создаётся в момент создания функции, а не вызова: поэтому вложенная функция видит переменные внешней даже после того, как внешняя завершилась.

function counter() {
  let n = 0;                 // живёт, пока жива inc
  return function inc() { return ++n; };
}

На практике это приватное состояние без классов, накопители в debounce/throttle, каррирование и мемоизация. Обратная сторона - утечки: если замкнуть тяжёлый объект ради одного поля, в памяти останется весь объект.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.