Чтобы понять замыкания, мы сначала рассмотрим области видимости.
Область действия:
Он определяет, где доступен элемент (например, переменная, константа). Давайте разберемся с примерами:
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().
Спасибо