функции в замыканиях формы JavaScript. Замыкание — это комбинация функции и лексического окружения, в котором эта функция была объявлена. (Сеть разработчиков Mozilla)

Здорово. Теперь мы все можем идти домой.

….. Я шучу.

Мы рассмотрим некоторый код, но давайте разберем, что это определение пытается нам сказать. «функция — это замыкание» — круто — и «замыкание — это комбинация функции и лексического окружения, в котором эта функция была объявлена». Это означает, что функции в JavaScript лучше осведомлены о своем окружении, чем функции или методы в других языках, не имеющих замыканий. Функции JavaScript знакомы с переменными, существующими в среде, в которой мы их создаем.

Если вы воспользуетесь услугами Google, чтобы понять, что такое замыкание, вы, вероятно, столкнетесь с примерами кода с вложенными функциями. Для этого есть веская причина, поскольку эти функции помогают продемонстрировать, как различные среды могут изменить наши замыкания, но приведенное выше определение объясняет, что ВСЕ функции являются замыканиями. Нам не нужно изобретать, чтобы объяснить, что, черт возьми, это за штука на самом деле.

В моем первом примере я объявляю переменную name со значением моего имени. Затем я пишу функцию printName, которая записывает в консоль переменную name, объявленную выше. Если вы проверите это на себе, то увидите, что это работает.

Может показаться очевидным, что это работает, но — присмотритесь — мы никогда не вызывали нашу функцию printName с аргументом. Что примечательно в том, что делает эта функция, так это то, что она является замыканием. Наша функция смогла получить переменную name, объявленную вне себя и в глобальной среде, чтобы завершить нашу операцию.

Теперь мы понимаем, что такое замыкание, но как и зачем его использовать?

Частные методы и шаблон модуля

Я собираюсь рассказать о двух примерах, где может помочь ваше новое понимание замыканий. Первый — частные методы. Приватный метод в JavaScript — это функция, доступ к которой можно получить только через другую функцию. Быстрый пример ниже.

Здесь я определил функцию publicFunction, которая возвращает другую функцию, secretFunction. Обе эти функции являются замыканиями по определению, но только publicFunction может быть легко вызвана сама по себе. Когда мы пытаемся записать в консоль нашу secretFunction, нам сообщают, что она не определена.

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

Использование замыканий в JavaScript позволяет нам скрыть нашу секретную функцию от остальной части нашей глобальной области видимости и даже повторно использовать имя в других функциях.

Частичное применение и каррирование

Понимание замыканий также важно для понимания механики частичного применения и каррирования. Когда мы передаем аргументы в функции, которые возвращают функции, наши функции возврата или замыкания знают об этих аргументах.

Давайте рассмотрим код ниже.

Здесь я определяю функцию multiplyNumbers, которая принимает два числа и возвращает их произведение. Я написал эту функцию, чтобы возвращать другую функцию в случае, если она получает только один аргумент. Эта функция возврата или замыкание может получить доступ к первой переменной, которую мы передали нашей внешней функции, multiplyNumbers, и завершить нашу операцию. В нижней части снимка экрана видно, что оба способа (передача обоих аргументов во внешнюю функцию И передача первого аргумента во внешнюю функцию, а второго во внутреннюю функцию) возвращают один и тот же результат.

Мы можем передать нашей внешней функции только один аргумент и назвать результирующую функцию (см. ниже).

Я считаю, что сила замыканий действительно сияет здесь. Наши именованные методы multiplyByFive и multiplyByFour созданы одной и той же функцией multiplyNumbers. Они отличаются только областью действия среды, к которой они относятся. Первый аргумент для multiplyByFive по-прежнему равен 5, даже после создания дополнительной функции multiplyByFour, которая принимает другой первый аргумент. Довольно круто, правда?

Спасибо, что прочитали это. Надеюсь, вы узнали, что функции в JavaScript могут быть больше, чем кажется на первый взгляд. Ниже приведены дополнительные ресурсы по замыканиям и тому, как их понимание становится полезным в функциональном программировании.



Собеседование по JavaScript: что такое закрытие?
«Собеседование по JavaScript
 — это серия постов, предназначенных для подготовки кандидатов к ответам на распространенные вопросы, которые они задают… среда.com»