так что я могу сделать вывод, что родительское лексическое окружение присоединяется, как только оно встречает определение функции (возвращаемую функцию), это правильно?
Присоединено к вновьобъект созданной функции, да.
родительская лексическая среда создается при объявлении и достижении функции в коде, а не при ее выполнении?
Нет.При оценке функции определение родительской среды уже существует.Родительская среда - это среда, в которой содержит объявление функции.
В вашем примере:
- Вызов
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 также имеет родителя, глобальная среда (при условии, что код оценивается в глобальной области видимости).Глобальная среда не имеет родителя.