Чтобы понять замыкания, мы сначала рассмотрим области видимости.

Область действия:

Он определяет, где доступен элемент (например, переменная, константа). Давайте разберемся с примерами:

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().

Спасибо