«Понимание замыканий похоже на то, когда Нео впервые видит Матрицу».

Закрытие - это ажиотаж. Умение распознать их очень ценится в игре разработчика. Вот почему секрет хорошо хранится. Но на самом деле: закрытие есть везде. Вы уже использовали их, даже не подозревая об этом.

В этой статье мы собираемся объяснить, как точно распознать закрытие. Больше никаких разочарований, и, наконец, «момент ага», который вы так долго искали.

Давайте сначала взглянем на скучное определение:

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

Здесь мы должны помнить только два основных момента. Я называю их привязкой и экспортом.

Обвязка 🔗

Здесь мы создали одну функцию (bar), вложенную в другую функцию (foo). Вложенный доступ к переменной (a) ее лексической области видимости. Теперь функция bar может «запоминать и получать доступ к своей лексической области видимости». Можно сказать, что область действия bar привязана к области действия foo.

Лексическая область видимости функции - это область, в которую функция вложена. Например, лексическая область видимости функции bar - это функция foo.

Да, это первая часть определения. Так это технически закрытие?

По-прежнему нет, мы упускаем последнюю часть.

Экспорт ✈️

Посмотрите, как bar передается как возвращаемое значение функции foo. И посмотрите, как мы присваиваем это возвращаемое значение переменной baz.

Функция bar теперь экспортирована, чувак. Мы можем «выполнить его вне его лексической области». Другими словами, мы можем использовать функцию bar напрямую, не передавая ее через функцию foo.

Готово ! 🍰

Функция bar по-прежнему имеет ссылку на область видимости функции foo, и эта ссылка называется закрытием.

Наше закрытие теперь полностью завершено и готово к использованию повсюду в нашем коде.

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