Привет, я читаю серию книг "Ты не знаешь JS" . Я на втором проходе, где я пытаюсь получить более глубокое понимание содержания. Пока перебираю главу о примерах и замыканиях. Следующий сценарий произошел со мной:
Рассмотрим этот пример
function test1(){
var a = 2;
return function(){console.log(a)};
}
var b = test1();
b(); // 2
var c = test1();
c(); // 2
Возвращенная функция из "test ()" поддерживает замыкание в области действия "test". Таким образом, каждый раз, когда мы вызываем эту возвращаемую функцию, мы получаем значение переменной «a», которое в данном случае равно «2». Теперь рассмотрим этот пример:
function test2() {
var a = Date.now();
return function() {console.log(a)}
}
var b = test2();
b(); // 1551867093995
var c = test2();
c(); // 1551867109249
Каждый раз, когда мы выполняем «test ()», переменной «a» присваивается время, когда была вызвана функция «test ()», и возвращается функция, которая поддерживает замыкание в области действия «test ()».
Мы вызываем «test ()» в двух отдельных случаях, присваивая возвращаемую функцию переменным «b» и «c».
Обратите внимание, что когда мы вызываем "b ()" и "c ()", мы получаем 2 разных значения, даже если каждый вызов ссылается на одну и ту же переменную в одной и той же области видимости (var a).
Кажется, что каждый раз, когда мы вызываем функцию (например, "test2 ()"), движок создает уникальный экземпляр объявляемой области функций для каждого вызова этой функции, и любое закрытие закрывается на уникальном экземпляре область действия функции. Это как если бы каждое объявление функции создавало «класс области», который описывает свою собственную область, и каждый раз, когда функция вызывается, создается экземпляр этого «класса области». Это действительно так? Может кто-нибудь объяснить это поведение или указать мне ресурс, который дает более глубокое объяснение областей JavaScript?
Спасибо