Я пытался понять, когда в js создается лексическая среда. Насколько я понимаю, лексическая среда создается в два этапа: этап создания и этап выполнения, но взгляните на следующее простое закрытие.
function makeAdder(x) {
return function(y) {
return x + y;
};
}
var add5 = makeAdder(5);
Итак, когда makeAdder возвращает функцию, он возвращает функцию с родительской лексической средой, указывающей на x, но я не понимаю, почему add5 уже имеет родительскую лексическую среду, а возвращаемая внутренняя функция еще даже не была выполнена , поэтому я могу сделать вывод, что родительская лексическая среда присоединяется, как только она встречает определение функции (функция возврата), это правильно? родительская лексическая среда создается, когда функция объявляется и достигается в коде, а не когда она выполняется? а что насчет лексического окружения возвращаемой функции, его лексическое окружение создается при выполнении функции add5. Пожалуйста, простите меня за длинный текст, я просто хочу уточнить, когда создаются родительская и локальная лексические среды.
Заранее спасибо, ребята.
Возможный дубликат Объяснение примера лексического окружения
so what I can infer is that the parent lexical environment is attached as soon as it encounters a function definition (the return function), is this correct ?
Да, прикрепленный к вновь созданному функциональному объекту.
the parent lexical environment is created when a function is declared and reached in the code and not when it is executed?
Нет. Родительская среда уже существует на момент оценки определения функции. Родительская среда - это среда, которая содержит объявляет функцию.
В вашем примере:
makeAdder
создает среду А с x
, установленным на 5
.function (y) {...}
) создается и получает «ссылку» на А.makeAdder
(внутренняя функция) присваивается add5
.add5
создает среду B с его родительский элемент установлен на А. Это возможно, потому что функция получила ссылку на А при создании.x
ищется в B. Он не найден, поэтому ищется в родительском элементе B, А, где он определен.Please forgive me for the long text I just want to clarify when is the parent and local lexical environments are created.
В ECMAScript есть разные типы сред, все они создаются в разное время:
Их больше, но они должны быть наиболее важными для этого вопроса. Для получения дополнительной информации см. https://www.ecma-international.org/ecma-262/8.0/index.html#sec-lexical-environments.
Однако в каждый момент времени только среда один является «активной» (верхняя часть стека). Всякий раз, когда создается новая среда, текущая активная среда становится ее родительской.
Спецификация определяет и использует следующие операции для создания новых сред:
NewDeclarativeEnvironment ( E )
NewObjectEnvironment ( O, E )
NewFunctionEnvironment ( F, newTarget )
NewGlobalEnvironment ( G, thisValue )
NewModuleEnvironment ( E )
где E
- это другая среда (становящаяся родителем новой среды), а F
- это функциональный объект. NewFunctionEnvironment
получает родительскую среду из объекта функции. NewGlobalEnvironment
не принимает родительскую среду, потому что в глобальной среде их не может быть.
Примечание: Среда А также имеет родителя, глобальная среда (при условии, что код оценивается в глобальной области). У глобальной среды нет родителя.
Я думаю, вы спрашиваете о чем-то, что находится здесь в деталях реализации интерпретатора.