Чтобы понять замыкания, мы сначала рассмотрим области видимости.
Область действия:
Он определяет, где доступен элемент (например, переменная, константа). Давайте разберемся с примерами:
const a = 10; console.log( a );
В приведенном выше примере область действия переменной a доступна во всей программе.
Теперь давайте посмотрим на типы прицелов:
1) Глобальный охват
2) локальная область
Глобальный охват:
Эти переменные доступны во всей программе.
В предыдущем примере мы обсуждали, что переменная a доступна во всей программе. Таким образом, переменная a находится в глобальной области видимости.
локальная область действия:
Эти переменные доступны во всей функции или блоке. Давайте посмотрим на пример
function calledFunction() { let b = 10; console.log(b); // prints 10 // here variable b is accessible } calledFunction(); console.log(b); // throws an error // here variable b is not accessible
Давайте разберемся, почему переменная b недоступна вне функции?
На приведенный выше вопрос ответом будет всякий раз, когда вызывается функция calledFunction(). Эта функция помещается в стек выполнения, и после того, как функция calledFunction() завершает свое выполнение, она извлекается из стека выполнения. Как только функция выталкивается, локальные переменные этой функции удаляются из памяти.
Итак, переменная b недоступна вне функции, потому что она не находится в памяти.
Давайте возьмем еще один пример, чтобы лучше понять ситуацию:
function calledFunction() { let a = 10; function nestedFuncstion() { console.log(a); // prints 10 } nestedFunction(); } calledFunction();
В приведенном выше примере переменная a доступна внутри функции nestedFunction() из-за ее вложенных функций.
function calledFunction() { let a = 10; function nestedFunction() { let a = 5; console.log(a); // prints 5 } nestedFunction(); console.log(a); // prints 10 } calledFunction();
В приведенном выше примере переменная a внутри функции nestedFunction() имеет значение 5, потому что функция nestedFunction() находит значение переменной a сначала в локальной области. Если переменная не объявлена, она смотрит на глобальную область видимости.
Теперь давайте разберемся с закрытием,
Закрытие:
Его можно определить как функцию вместе с родительской областью. Давайте разберемся на примере
function calledFunction() { let a = 10; function closure() { // closure console.log(a); } closure(); } calledFunction();
В приведенном выше примере функция closure() является замыканием и имеет доступ к своей родительской области, т. е. функции вызваннойFunction(). мы также можем определить закрытие как функцию вместе с ее внешней областью действия.
Давайте больше разберемся с замыканиями:
function calledFunction() { return function returnedFunction() { let a = 10; console.log(a); } } const storedFunction = calledFunction(); storedFunction();
В приведенном выше примере при вызове функции calledFunction() она вернет функцию returnedFunction(), которая будет сохранена в storedFunction и теперь при вызове функции storedFunction() возвращаемая функция будет выполняться, т.е. функция returnedFunction().
function calledFunction() { let a = 10; return function returnedFunction() { console.log(a); } } const storedFunction = calledFunction(); storedFunction();
Приведенный выше код работает нормально, потому что, как и в обсуждаемом определении, замыкания ограничены своей родительской областью, то есть функцией вызваннойFunction(). поэтому всякий раз, когда вызывается returnedFunction(), он будет печатать 10, который является локальным для функции вызванногоFunction().
Спасибо