Поговорим о закрытии, закрытии Javascript.
Замыкание иногда было модным словом в сообществе Javascript. Существует высокая вероятность того, что вы знаете концепцию или использовали / наблюдали, что такое закрытие, не зная (потому что я когда-то знал).
Прежде чем мы перейдем к завершению, давайте поговорим о лексической области видимости.
Что такое лексическая область видимости…?
Итак, javascript перед выполнением сначала интерпретируется (надеюсь, вы уже знали, что javascript - это интерпретируемый язык, а не компилируемый язык). ранняя фаза интерпретации (когда исходный код отправляется в движок через интерпретатор) называется лексированием (фазой лексирования), которая определяет, где и как объявляются все идентификаторы, и, таким образом, как они будут просматриваться во время выполнения. Это решающий этап, позволяющий движку Javascript знать о переменных, не перемещая их в исходный код. Во время лексирования переменные определяются в первую очередь перед поднятием назначенного (это может быть другая тема).
Поскольку функции также определены в это время (фаза лексирования), мы можем сказать, что лексическая область видимости зависит от того, где существуют переменные и блоки области видимости, когда код был написан, и, таким образом, заблокированы в конце фазы лексирования. Область не определяется во время выполнения, а доступна только во время выполнения. Между прочим, область видимости - это причудливый способ места, где движок javascript будет искать что-то.
Закрытие
Замыкание - это функция в JavaScript, при которой внутренняя функция имеет доступ к переменным внешней (включающей) функции - цепочке областей видимости. Это означало, что функция может запоминать и получать доступ к своей лексической области видимости, даже если эта функция выполняется вне ее лексической области видимости. Я предполагал, что вы уже знаете об объемах, если об этом нет хорошей статьи.
Это означает, что innerFunction
, определенный внутри outerFunction
, будет иметь доступ к внешней области видимости outerFunction
, также если будет возвращен внутри нее и вызван вне outerFunction
или, другими словами, вне ее области видимости, ее лексической области !. Лексический объем определяется по времени автора и фиксируется во время компиляции, как было подчеркнуто ранее.
Замыкание имеет три цепочки областей видимости:
- он имеет доступ к своей собственной области видимости - переменным, определенным в его фигурных скобках (например,
innerFuctionVariable
) - он имеет доступ к переменным внешней функции (например,
outerFuctionVariable
) - он имеет доступ к глобальным переменным (например,
globalVariable
)
innerFunction
может получить доступ к переменным включающей функции из-за замыканий в JavaScript. Другими словами, innerFunction
сохраняет цепочку областей видимости включающей функции во время выполнения включающей функции и, таким образом, может получить доступ к переменным включающей функции.
Где / когда мне нужно закрытие? ...
Есть много вариантов использования для закрытия, но в последнее время из-за широкого использования ES6 и выше в разработке мы видели, как много используются классы Javascript. Но есть также путаница в том, как управлять this
, отсюда и использование фабричных функций.
Это будет моя следующая тема, Заводские функции.
С Новым 2019 годом
Быть безопасным.