Замыкания. Почему в этом случае удаляется lexical environment родительской функции?

Цитата с learn.javascript.ru
В следующем коде, после того как g станет недоступным, лексическое окружение функции (и, соответственно, value) будет удалено из памяти:

function f() { 
  let value = 123; 
  function g() { 
    alert(value); 
  } 
  return g; 
} 
let g = f(); // пока g существует, соответствующее лексическое окружение существует 
g = null; // ...а теперь память очищается


Я не понимаю почему лексическое окружение родительской функции будет удалено из памяти. Ведь мы по сути только очистили переменную g и сказали, что там ничего нет - g = null. Сама же вложенная функция осталась, ее никто не удалял.

Либо же здесь имеется в виду, что в строке let g = f();есть вызов родительской функции, которая выполняясь, создает лексическое окружение. Поэтому меняя значение переменной на null, мы просто убираем вызов этой родительской функции? Как? Что здесь имеется в виду?
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В переменную g у вас записывается ссылка на функцию, которая вернулась из f(). Пока эта ссылка доступна из глобального контекста (через g), функция сохраняется в памяти. Весь контекст, связанный с функцией, также сохраняется, поскольку тоже доступен из глобального контекста (через g и функцию).
Присваивая переменной null вы, тем самым, делаете функцию и связанный с ней контекст недоступными из глобального контекста. Значит при следующем проходе сборщик мусора удалит их как неиспользуемые.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
На самом деле даже если не присвоить null, а просто не использовать g дальше в коде, оно тоже будет собрано сборщиком.
Отлично описано в деталях как он работает
https://developer.mozilla.org/en-US/docs/Web/JavaS...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы