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

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

Здесь у нас две функции. Внешняя функция имеет переменную с именем «a» и возвращает внутреннюю функцию. Внутренняя функция имеет переменную с именем «b» и обращается к переменной из внешней функции. После этого мы сохраняем результаты выполнения внешней функции в переменную myFunc. Это означает, что myFunc теперь удерживает внутреннюю функцию. При выполнении мы фактически получаем вывод суммы на терминал. Почему? Поначалу может показаться, что этот код действительно работает. В других языках программирования локальные переменные внутри функции существуют только на время выполнения этой функции. Вы можете ожидать, что после выполнения внешней функции переменная «a» больше не будет доступна. В JavaScript это не так благодаря замыканиям. Замыкание — это комбинация функции и лексического окружения, в котором эта функция была объявлена. Эта среда состоит из любых локальных переменных, которые находились в области видимости во время создания замыкания. Эта функция JavaScript позволяет запускать подобный код. Все становится намного интереснее, когда эти функции начинают принимать аргументы. Давайте посмотрим на пример.

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

Я надеюсь, что это поможет любому понять основы замыканий. Это очень интересная тема, и мне еще многое предстоит о ней узнать. Практика с ними поможет только больше. Вопросы о закрытии часто задают во время собеседований, поэтому очень важно понимать эту концепцию, чтобы пройти собеседование. Удачного кодирования! 😎