Замыкания
1. Замыкания
Замыкание (closure) — это связь между функцией и ее цепочкой областей видимости.
Этот механизм возможен благодаря лексическому окружению. При вызове функции, ее лексическое окружение получает ссылку на ту область видимости, где функция была объявлена (внешнее лексическое окружение), тем самым получая доступ к переменным из нее, буквально удерживая в памяти таблицу доступных переменных.
Итого, замыкание - это термин который описывает способность функции запоминать лексическое окружение в котором она была объявлена, и продолжать получать доступ к переменным из этого лексического окружения вне зависимости от того, где она была вызвана.
Рассмотрим пример функции-счетчика с недоступной извне переменной.
В примере функция createCounter
создаёт локальную переменную privateValue
, а также локальную функцию increment
, которая увеличивает значение privateValue
и выводит значение в консоль.
Функция increment
не содержит собственной локальной переменной privateValue
, но благодаря механизму замыкания ей доступна переменная из внешнего окружения функции createCounter
. В результате она может пользоваться переменной privateValue
, созданной во время вызова функции createCounter
, даже после того, как increment
будет возвращена из вызова createCounter
.
Если заглянуть внутрь counterA
и counterB
используя console.dir()
, наглядно видно механизм замыкания.
Напишем функцию приготовления поваром некого блюда.
Проблема такого подхода в том, что при каждом вызове функции приходится передавать имя повара который будет готовить блюдо. Решить эту проблему можно используя замыкание. Пишем функцию создания шефа с именем, которая возвращает другую функцию для приготовления блюда.
Посмотрим в консоль.
2. Дополнительные материалы
Исчерпывающая статья по замыканиям от Preethi Kasireddy, по ссылкам ниже, обязательна к прочтению в свободное от изучения основного материала время.
Last updated