Когда создается родительская лексическая среда - PullRequest
0 голосов
/ 24 октября 2018

Я пытался понять, когда в js создается лексическая среда.Насколько я понимаю, лексическая среда создается в два этапа: этап создания и этап выполнения, но посмотрите следующее простое закрытие.

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

var add5 = makeAdder(5);

, поэтому, когда makeAdder возвращает возвращаемую функциюфункция с родительской лексической средой, указывающей на x, но я не понимаю, почему add5 уже имеет родительскую лексическую среду, а возвращаемая внутренняя функция еще даже не выполнена, поэтому я могу заключить, чтородительское лексическое окружение присоединяется, как только оно встречает определение функции (возвращаемую функцию), это правильно?родительская лексическая среда создается, когда функция объявлена ​​и достигнута в коде, а не когда она выполняется?а что касается лексического окружения функции, которая была возвращена, то ее лексическое окружение создается при выполнении функции add5.Пожалуйста, прости меня за длинный текст, я просто хочу уточнить, когда создается родительская и локальная лексическая среда.

Заранее спасибо, ребята.

1 Ответ

0 голосов
/ 24 октября 2018

так что я могу сделать вывод, что родительское лексическое окружение присоединяется, как только оно встречает определение функции (возвращаемую функцию), это правильно?

Присоединено к вновьобъект созданной функции, да.

родительская лексическая среда создается при объявлении и достижении функции в коде, а не при ее выполнении?

Нет.При оценке функции определение родительской среды уже существует.Родительская среда - это среда, в которой содержит объявление функции.

В вашем примере:

  • Вызов makeAdder создает среду A с x, установленным на 5.
  • Внутренняя функция (function (y) {...}) создается и получает «ссылку» на A .
  • Возвращаемое значениеmakeAdder (внутренняя функция) присваивается add5.
  • Вызов add5 создает среду B с , его родительский элемент установлен на A .Это возможно, потому что функция получила ссылку на A при ее создании.
  • x ищется в B .Он не найден, поэтому он был найден в родительском элементе B , A , где он определен.
  • ...

Пожалуйста, прости меня за длинный текст, который я просто хочу уточнить, когда создается родительская и локальная лексическая среда.

Существуют различные типы сред в ECMAScript, все они создаются в разное время:

  • Декларативная среда: База всех других сред и создается при оценке блока .
  • Среда функции: создается при оценке вызова функции .
  • Глобальная среда: создается при оценке сценария / при инициализации среды выполнения.

Есть и другие, но они должны быть наиболее подходящими для этого вопроса.Для получения дополнительной информации см. https://www.ecma -international.org / ecma-262 / 8.0 / index.html # sec-lexical-Environment

Однако в каждый данный момент времени одна среда является «активной» (вершина стека).Всякий раз, когда создается новая среда, текущая активная среда становится ее родителем.

Спецификация определяет и использует следующие операции для создания новых сред :

  • NewDeclarativeEnvironment ( E )
  • NewObjectEnvironment ( O, E )
  • NewFunctionEnvironment ( F, newTarget )
  • NewGlobalEnvironment ( G, thisValue )
  • NewModuleEnvironment ( E )

где E является другой средой (становится родителем новой среды), а F является функциональным объектом.NewFunctionEnvironment получает родительскую среду из объекта функции.NewGlobalEnvironment не принимает родительскую среду, потому что глобальная среда не может иметь ее.


Примечание: Среда A также имеет родителя, глобальная среда (при условии, что код оценивается в глобальной области видимости).Глобальная среда не имеет родителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...