JavaScript, отдельный экземпляр одной и той же функции, возвращает другое значение для одной и той же закрытой переменной - PullRequest
0 голосов
/ 06 марта 2019

Привет, я читаю серию книг "Ты не знаешь 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?

Спасибо

1 Ответ

0 голосов
/ 06 марта 2019

Каждый раз, когда вы вызываете test2, двигатель создает новое закрытие.

Если вы хотите повторно использовать то же самое замыкание, то вам также необходимо использовать ту же самую переменную:

function test2() {
  var a = Date.now();
  return function() {console.log(a)}
}

var b = test2();
b();
b(); // the same
...