У каждого младшего разработчика Javascript есть момент в процессе собеседования, когда мужчина / женщина / никто или оба, сидящие напротив них, спрашивают, довольно просто: «Что такое замыкания?»

И что такое закрытия. Почему эта концепция так запутывает новичков? А почему это важно? Где ты это видишь?

Официальное определение закрытий от MDN:

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

Давайте немного перемотаем назад и вернемся к некоторым основным концепциям. Для Javascript каждая объявленная функция создает свою собственную область видимости. Но если функция «foobar» использует переменную «foo», которая находится за пределами ее фигурных скобок в глобальной области видимости, не противоречит ли это этому определению?

Нет, потому что Javascript имеет лексическую область видимости с областью действия функции. Лексическая область видимости в Javascript означает, что переменная, определенная вне функции, может быть доступна внутри другой функции, определенной после объявления переменной.

Вот еще одно хорошее определение. Цитата из лучшей статьи на Medium, чем эта,

Замыкание - это комбинация функции, объединенной (заключенной) со ссылками на ее окружающее состояние (лексическое окружение). Другими словами, замыкание дает вам доступ к области внешней функции из внутренней функции. В JavaScript замыкания создаются каждый раз, когда создается функция, во время создания функции .

Чтобы использовать замыкание, определите функцию внутри другой функции и откройте ее. Чтобы открыть функцию, верните ее или передайте другой функции.

Внутренняя функция будет иметь доступ к переменным во внешней области функции даже после возврата внешней функции.

Вы можете продолжать читать эту статью, в которой есть прекрасный пример из реальной жизни о конфиденциальности данных и о том, как закрытие является основным механизмом, используемым для этого. Вот пример попроще. Этот пример взят из видео Дэна Шиффмана из The Coding Train видео о замыканиях, и я настоятельно рекомендую вам посмотреть и его.

Идея, которую я считаю захватывающей из этого видео выше, - это замыкания и ООП. Шиффман упоминает около 2:23, что закрытие делает что-то похожее на объектно-ориентированное программирование (ООП), потому что оно помогает «закупорить, удерживать этот пузырь (пузырь закрытия), в котором есть все эти вещи, которые имеют каждый из этих элементов DOM [например, счетчик , setTimeout из функции] ».

Так что. Замыкания сложно объяснить другому человеку (даже другому разработчику), потому что существует очень много разных способов объяснить это, и у многих из нас есть разные ментальные модели для этого. Этот блог был просто моим способом документировать, как я обрабатывал эту тему.