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

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

Простой пример такой функции:

Это не может быть проще. Функция buildName() объявляет приветствие локальной переменной и возвращает ее. Каждый вызов функции создает новую область видимости с новой локальной переменной. После завершения выполнения функции у нас нет возможности снова обратиться к этой области, поэтому она удаляется сборщиком мусора.

Но как насчет того, когда у нас есть ссылка на эту область?

Давайте посмотрим на следующую функцию:

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

В этом случае после выполнения buildName область видимости не уничтожается. Функция sayMyName() по-прежнему имеет к нему доступ, поэтому он не будет удален сборщиком мусора. Однако нет другого способа доступа к данным из внешней области, кроме замыкания. Закрытие служит шлюзом между глобальным контекстом и внешней областью.

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

Заключение

Замыкание — это внутренняя функция, которая имеет доступ к области видимости внешней функции. Если внешняя функция вызывается несколько раз, каждый вызов создает новое замыкание. Существование замыкания зависит от существования их родительской функции.

Спасибо за чтение.