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

Лексическая область видимости – это позиция, в которой была определена переменная.

Лексическая область видимости также называется статической областью видимости.

Пример

let message = "Hello";

function greeting(){
    let name = "Job"
    console.log(message+" "+name)
}
greeting()
// output: Hello Job

Переменная message объявлена ​​глобально, что делает ее доступной внутри функции приветствия.

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

Пример


function greeting(){
   let message = "Hello";
   function sayHello(){
       console.log(message);
   }
   sayHello()
}
greeting()
//Hello

Функция приветствия имеет переменную message и sayHello(), которая является внутренней функцией.

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

Внутренняя функция может получить доступ к переменной message внешней функции.

В функции приветствия мы вызываем функцию sayHello.

Затем, когда мы вызываем функцию приветствия, мы получаем вывод:

//Привет

Завершение

Теперь посмотрим на закрытие:

Что такое закрытие в JavaScript?

Это комбинация набора функций со ссылками на его лексическое окружение

Полное определение можно найти на сайте moxilla.org.

Пример:

function greeting(){
     let message = "Hello"
     function sayHello(){
     console.log(message);
     }
     return sayHello;
}
let hello = greeting()
hello()
//Hello

Когда мы вызываем функцию приветствие, она возвращает SayHello().

ƒ sayHello(){
 console.log(message);
 }

Переменная hello ссылается на функцию sayHello(), поскольку ей присвоено значение greeting()

Когда мы выполняем hello(), он запускает функцию sayHello, которая теперь выводит сообщение на консоль.

Локальные переменные доступны только во время выполнения этой функции. Когда hello() выполняется, переменная message по-прежнему доступна.

Еще один пример закрытия:

function greeting(message){
   return function(name){
     return message+ " " + name;
   }
}
let sayHello = greeting("Hello");
console.log(sayHello("Job"))

Объяснение:

Функция приветствие принимает один аргумент с именем «сообщение», а внутренняя функция принимает в качестве аргумента «имя».

Внутренняя функция возвращает приветственное сообщение, которое представляет собой комбинацию переменных «message» и «name».

Функция greeting ведет себя как фабрика функций, поскольку она создает sayHello(), соответствующий сообщению «Hello».

поэтому SayHello() будет закрытием.

ПРИМЕЧАНИЕ. Функции являются первым классом в JavaScript, поэтому вы можете вернуть функцию из другой функции.

Сводка

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

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