Чтобы понять замыкания, мы должны напомнить себе о 3 фактах в JavaScript:

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

Обратите внимание, что в приведенной выше функции функция make использует переменную magicIngredient, которая определена во внешней функции makeSandwitch.

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

По сравнению с первым примером это выглядит похоже, за исключением того, что мы не вызываем make("jelly") сразу, а вместо этого функция sandwitchMaker возвращает make. Теперь значение f на самом деле является нашей функцией make, и вызов f аналогичен вызову make. .

Функции JavaScript внутренне хранят любые переменные, на которые они могут ссылаться и которые определены в их объемлющих областях. Функции, которые отслеживают переменные из содержащих их областей, называются замыканиями. Функция make представляет собой замыкание, код которого ссылается на две внешние переменные: magicIngredient и filling. Всякий раз, когда вызывается функция make, ее код может ссылаться на эти две переменные, поскольку они хранятся в замыкании. (*)

Третий факт о замыканиях заключается в том, что они могут обновлять значения внешних переменных.

Важно: Замыкания фактически хранят ссылки на свои внешние переменные, а не копируют их значения.

В этом примере создается объект, содержащий три замыкания: свойства set, get и type. Каждое из этих замыканий имеет общий доступ к переменной val. Замыкание набора обновляет значение val, а последующий вызов get и type видит результаты обновления.(*)

Надеюсь, это многое объясняет. Пожалуйста, поделитесь своими примерами или предложениями в разделе комментариев.

(*) Все примеры взяты из книги «Эффективный JavaScript» Дэвида Хермана.