Ответ 1
Дать ответ на основе того, что я только что узнал из "Тайны ниндзя Javascript, 2/е" -
Это разные концепции, но связанные, нам нужно определить связанную концепцию - контекст выполнения и стек, который нужно понять.
Контекст выполнения и стек контекста выполнения. Контекст выполнения - это внутренняя конструкция javascript для отслеживания выполнения функции или глобального кода. Движок js поддерживает структуру данных стека - стек контекста исполнения или стек вызовов, который содержит эти контексты, а глобальный контекст исполнения остается в нижней части этого стека. И новый контекст выполнения создается и помещается в стек, когда начинается выполнение функции. Конкретный контекст выполнения отслеживает указатель, в котором выполняется оператор соответствующей функции. Контекст выполнения извлекается из стека после завершения выполнения соответствующей функции.
Лексическая среда: это внутренняя конструкция движка js, которая содержит отображение идентификатора-переменной. (здесь идентификатор относится к имени переменной/функции, а переменная - ссылка на фактический объект [включая объект типа функции] или примитивное значение). Лексическая среда также содержит ссылку на родительскую лексическую среду.
Теперь для каждого контекста выполнения: 1) создается соответствующая лексическая среда и 2) если в этом контексте выполнения создается какая-либо функция, ссылка на эту лексическую среду сохраняется во внутреннем свойстве ([[Environment]]) этой функции., Таким образом, каждая функция отслеживает лексическую среду, связанную с контекстом выполнения, в котором она была создана.
И каждая лексическая среда отслеживает свою родительскую лексическую среду (среду родительского контекста выполнения). В результате к каждой функции привязана цепочка лексических сред. [Примечание: в js функция - это объект, создание функции с помощью оператора означает создание объекта типа Function. Как и другие объекты, функция может содержать свойства как внутренние, так и определяемые пользователем.]
Область применения: это независимая от языка концепция, которая относится к видимости переменных или функций в исполняемом коде. В js переменная или функция видимы для исполняемого кода, если они есть в текущей лексической среде или в цепочке лексической среды включающей функции. В случае глобального кода цепочка не существует.
Надеюсь, вы понимаете сейчас... пожалуйста, добавьте комментарий, если какое-либо предложение трудно понять.
Примечание: аналогично случаю функции, введением let и const в es6, когда блок начинает выполняться (если блок, для цикла цикла и т.д.), Также создается новая лексическая среда, в которой родительская функция является лексической средой в качестве родительской.