Я подписался на курс по основам JS, организованный Флавио Копесом. Каждый день Флавио рассылает участникам электронные письма с парой вопросов/задач. Всего должно быть 35 писем. Отвечать на них не обязательно, но ответы на вопросы являются важной частью курса. Поэтому я решил поделиться своими ответами с миром: в лучшем случае это может помочь кому угодно, кроме меня, в худшем — только мне.

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

Во многих языках программирования переменные внутри функций существуют только во время выполнения этих функций.

Но в JS такого нет.

В JS переменные, объявленные внутри функций, не удаляются из памяти после выполнения функции. Это позволяет нам извлекать такие переменные и их значения. Механизм, который обеспечивает это, называется замыканием.

Здесь есть нюанс: мы не можем напрямую извлекать переменные из области видимости функции. Но если функция возвращает другую функцию, возвращаемая функция запоминает свою область видимости со всеми родительскими переменными.

Давайте посмотрим на пример ниже. Мы объявляем функцию с переменной name внутри и функцией displayName в качестве возвращаемого значения. Затем мы пытаемся напрямую обратиться к name. Это не сработает и мы видим в консоли undefined. Далее используем внутреннюю функцию для вывода на консоль фразы с этой переменной.

Мы можем пойти дальше и использовать возможности замыкания для создания и извлечения независимых переменных.