Закрытие для людей без диплома по информатике.

Я просмотрел несколько руководств, курсов, прочитал сообщения в блогах и другие ресурсы о замыканиях в JavaScript. Многие из них упоминают, что их понимание - это то, что может отличить среднего разработчика JavaScript от отличного. Все в восторге от закрытий, вы часто можете встретить словесные вспышки вроде «Вау, ма! Я только что заметил закрытие!», Затем они приводят какой-то пример с какой-то вложенной функцией, каким-то foo и некоторым bar, а затем они ожидают, что вы будете поражен. И вы можете почувствовать себя кем-то, чей кот только что с гордостью преподнес труп грязной мыши.

Я могу связаться с вами, если вы пытаетесь узнать о закрытии и не испытываете внезапного прилива энтузиазма, услышав о том, как работает закрытие. Я хотел бы предоставить вам объяснение, которое исходит от человека, который не имеет степени в области компьютерных наук (не гордится этим) и его первым языком программирования является JavaScript. Звучит отлично? Вот так.

Определение закрытия

Во-первых, во многих руководствах не разъясняется правильное использование и значение слова «закрытие». Если вы просто поищете определение слова «закрытие», вы наверняка будете сбиты с толку - что уже того стоит, поскольку «сбитый с толку» - такое классное слово. Как вообще это связано с функциями JavaScript? Очень часто, когда я читал описания закрытий JavaScript, это звучало так, как будто люди играют в игру Табу, где вы должны описать что-то, не используя слишком очевидные подсказки, а другая сторона должна это угадать. Так что же такое закрытие?

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

Прежде всего, когда может произойти закрытие? Когда есть вложенные функции (функция внутри другой функции), механизм JavaScript «закрывает» - сохраняет - данные, находящиеся внутри «замыкания», которые обычно собираются сборщиком мусора. Так что же в «закрытии»? Это то, что использует внутренняя функция, но она была определена в области видимости внешней функции. Он сохраняется в памяти движком JavaScript для дальнейшего использования, даже после выполнения функции.

Почему он такой особенный?

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

Тот факт, что этого не происходит в данном конкретном контексте в JavaScript, представляет собой бинарную реку радости и вечных пятерок для тех девушек и парней, которые только что проявили себя из фильма «Рыба-меч». Эта особенность языка открывает множество возможностей для более творческого кодирования.

В большинстве случаев механизм выполнения уничтожит эти данные, и вы больше не сможете их использовать. Но в JavaScript, если есть вложенная функция и вы определили некоторые значения в области внешней функции, даже после того, как внешняя функция запускается и предполагается, что она будет «собрана мусором» - со всем ее внутренним содержимым - среда JavaScript «волшебным образом» ”Сохраняет все значения, используемые внутренней функцией, где-нибудь в памяти. Таким образом, внутренняя функция сможет использовать значения из родительской области видимости, даже когда эта область исчезнет (исчезнет, ​​то есть обработан механизмом, извлечен из стека выполнения и предположительно собран сборщиком мусора). Вот как работает замыкание. Оно сохраняет данные, которые, как ожидается, будут выброшены в мусор.

Это не кричащая магия Гарри Поттера, но кодеры имеют более низкий порог того, что они называют магией. Смирись с этим!

Чтобы сделать его более доступным, вот еще один пример (это здорово, не жалуйтесь)

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

Теперь ваша мама устно описала вам функцию холодильника - «внешнюю» функцию - следующим образом:

›Войдите на кухню;

›Откройте холодильник;

›Выньте яйца;

›Закройте холодильник;

›Следуйте инструкциям рецепта на дверце холодильника.

На дверце холодильника есть наклейка с описанием того, как приготовить яичницу-болтунью: Этот рецепт - «внутренняя» функция холодильника - вложенная функция:

›Выложите яйца на сковороду;

›Включите огонь;

›Не проявляйте пощады;

›Через 3 минуты убавьте огонь;

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

А вот и волшебное завершение. В движке JavaScript каждый раз, когда вы вынимаете яйца и завершаете «функцию холодильника», коробка с яйцами остается снаружи, чтобы вы могли использовать их позже. На кухне они «закрыты», просто лежат где-то на кухонном столе (где-то в памяти). Итак, теперь, даже если холодильник полностью исключен из поля зрения - даже если он сломан или даже направлен на инопланетный корабль - вы все равно можете использовать функцию рецепта, если чувствуете голод, и использовать те яйца, которые требуются этой функции, потому что они доступны для тебя. Вы только что пережили закрытие. Та-дааа!

Если у вас все еще есть вопросы, убедитесь, что вы ознакомились со следующими условиями, касающимися областей, цепочек областей и стека выполнения.

Боковое примечание: я действительно восхищаюсь людьми, которые много работали и получили степень CS, я считаю, что это большое преимущество и обеспечивает лучшее / более глубокое понимание любой темы, связанной с кодированием. Это небольшое руководство предназначено в основном для людей, пришедших из разного фона на один и тот же перекресток, и я очень надеюсь, что это помогло вам лучше понять замыкания.

Желаю всем волшебного дня и веселых приключений в программировании!