Есть два основных столпа javascript, которые делают его очень мощным, - это замыкания и наследование прототипов. Поняв эти два принципа, вы откроете для себя настоящую мощь javascript.

До сих пор, когда я пишу этот блог, javascript является самым используемым и популярным языком в мире, но некоторые его концепции все еще сбивают с толку, например, закрытие. Я думаю, что после прочтения этого блога вы откроете для себя одно из самых запутанных закрытий тем.

Концепция закрытия зависит от двух вещей

  • Функция в javascript - первоклассный гражданин
  • Javascript имеет лексическую область видимости

Что я имею в виду под словом «Функционер первоклассный гражданин, давайте поймете»

В javascript функция может быть назначена переменной, которая называется выражением функции. Функция в javascript может быть передана как параметр другой функции или может быть возвращаемым значением вызова функции.

Выше приведен пример выражения функции

Выше приведен пример функции как параметра и функции как возвращаемого значения.

Лексическая область

Лексический означает, где был написан код и какие переменные доступны функции. У меня есть ответный блог об области действия в javascript, если вы хотите подробно узнать об области действия, вы можете проверить ее



Что такое закрытие

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

Разберемся на примере

Функция «a» имеет переменную grandFather, когда функция a выполняется и удаляется из стека, переменная grandFather не удаляется из кучи памяти, потому что на нее имеется ссылка внутри функции c. В куче памяти создается закрытие, где переменная grandFather уходит до тех пор, пока функция c не будет выполнена, переменная grandFather не будет удалена из карты памяти

Аналогичное происходит с переменной отцом, определенной внутри функции b, после того, как функция b будет выполнена и удалена из стека вызовов, переменная отца помещается вместе с дедушкой в ​​одно и то же закрытие.

Теперь, когда функция c выполняется, она пытается получить доступ к переменной grandFather, сначала она просматривает ее переменную envrionment, а переменная grandFather не определена внутри функции c, поэтому она недоступна в переменной среде функции c, затем функция c просматривает закрытие, чтобы найти значение переменной grandFather, где оно разрешается, и то же самое происходит с переменной отца, для переменной son оно разрешается из переменной среды функции c, как она определена внутри функции c

Вот как работает закрытие в javascript.

Преимущества закрытия

  • Эффективная память
  • Инкапсуляция

Эффективная память:

Замыкания эффективны с точки зрения памяти. Давайте разберемся в этом на примере

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

В примере withClosure массив переменных создается один раз, и при каждом выполнении findFromIndex мы ссылаемся на переменную arr из закрытия. Таким образом, избегается создание переменной снова при каждом выполнении.

Инкапсуляция

Что такое инкапсуляция. инкапсуляция означает защитный экран, который предотвращает доступ к данным для кода за пределами этого экрана. Давайте разберемся в этом на примере

В приведенном выше примере у нас есть переменная protectData, которая должна быть защищена, это означает, что мы не хотим предоставлять прямой доступ для управления ею, мы хотим обеспечить только удобочитаемость, поэтому мы создали функцию accessData, которая возвращает значение защищенной переменной, This является инкапсуляцией и все это возможно из-за закрытия, так как при выполнении функции encapEg будет удален из стека после ее выполнения, но protectedData не будет удален, потому что на него ссылается функция accessTheData, и его значение будет сохранено в закрытие.

Надеюсь, эта статья поможет вам понять закрытие и его преимущества.

Следите за обновлениями в Twitter и Github.