Чтобы понять, что такое замыкание, рассмотрим пример:
function person() {let name = 'Peter';
return function displayName() {
console.log(name);
};
}
let peter = person();
peter(); // 'Peter'
Вызов функции peter() возвращает функцию displayName(). В свою очередь, функция displayName() имеет доступ к переменной name, которая расположена во внешней по отношению к ней функции. Таким образом, функция displayName() является замыканием.
Итак, замыкание — это функция, которая запоминает и имеет доступ к лексическому окружению, в котором она была создана (контекст выполнения).
Контекст выполнения — это место функции среди соседей и родителя. Код функции выполняется внутри контекста выполнения функции. Пример:
Здесь создается переменная, находящаяся в глобальном контексте и функция, создающая свой контекст.
Лексическое окружение — это хранилище для данных в памяти и механизм для извлечения этих данных при обращении:
- место переменной или функции в коде
- Путь, позволяющий обратиться к внешнему компоненту. Ссылка на родителя.
Эти два понятия: лексическое окружение и контекст выполнения основные для понимания работы механизма замыкания.
Рассмотрим примеры:
function getCounter() {
let counter = 0;
return function inner() {
return counter++;
};
}
let count = getCounter();
console.log(count()); // 0
console.log(count()); // 1
console.log(count()); // 2
Лексическое окружение функции getCounter() состоит из переменной counter и функции inner(). Внешнее лексическое окружение — глобальные значения.
Результат работы функции getCounter(), то есть функция inner(), назначается записывается в переменную count.
Теперь мы вызываем функцию count() , которой, казалось бы нет и ее внутреннее лексическое окружение пусто. Но внешнее ссылается на переменную count (так как это родительский контекст) и записанную в ней функцию getCounter() .
И в результате, функция count() способна влиять на лексическое окружение getCounter() , изменяя переменную counter. (counter++).
Заключение.
Понять механизм работы замыканий очень важно, так как это залог успешного решения рабочих задач. Советуем уделить этой теме больше времени и внимания, поискать примеры и учебные задания, чтобы научится применять этот механизм на практике.