Лексическая среда и сфера действия

Является ли лексическая среда и область действия в javascript одним и тем же?

3 ответа

Решение

Дать ответ на основе того, что я только что узнал из "Тайны ниндзя Javascript, 2/ е" -

Это разные концепции, но связанные, нам нужно определить связанную концепцию - контекст выполнения и его стек, чтобы понять.

Контекст выполнения и стек контекста выполнения. Контекст выполнения - это внутренняя конструкция javascript для отслеживания выполнения функции или глобального кода. Движок js поддерживает структуру данных стека - стек контекста исполнения или стек вызовов, который содержит эти контексты, а глобальный контекст исполнения остается в нижней части этого стека. И новый контекст выполнения создается и помещается в стек, когда начинается выполнение функции. Определенный контекст выполнения отслеживает указатель, в котором выполняется оператор соответствующей функции. Контекст выполнения извлекается из стека после завершения выполнения соответствующей функции.

Лексическая среда: это внутренняя конструкция движка js, которая содержит отображение идентификатора-переменной. (здесь идентификатор относится к имени переменной / функции, а переменная - это ссылка на фактический объект [включая объект типа функции] или примитивное значение). Лексическая среда также содержит ссылку на родительскую лексическую среду.

Теперь для каждого контекста выполнения: 1) создается соответствующая лексическая среда и 2) если в этом контексте выполнения создается какая-либо функция, ссылка на эту лексическую среду сохраняется во внутреннем свойстве ([[Environment]]) этой функции., Таким образом, каждая функция отслеживает лексическую среду, связанную с контекстом выполнения, в котором она была создана.

И каждая лексическая среда отслеживает свою родительскую лексическую среду (среду родительского контекста выполнения). В результате к каждой функции привязана цепочка лексических сред. [Примечание: в js функция - это объект, создание функции с помощью оператора означает создание объекта типа Function. Как и другие объекты, функция может содержать свойства как внутренние, так и определяемые пользователем.]

Сфера действия: это независимая от языка концепция, которая относится к видимости переменных или функций в исполняемом коде. В js переменная или функция видимы для исполняемого кода, если они есть в текущей лексической среде или в цепочке лексической среды включающей функции. В случае глобального кода цепочка не существует.

Надеюсь, вы понимаете сейчас... пожалуйста, добавьте комментарий, если какое-либо предложение трудно понять.

Примечание: аналогично случаю функции, путем введения let и const в es6, когда блок начинает выполняться (если блок, для цикла цикла и т. Д.), Также создается новая лексическая среда, в которой лексическая среда родительской функции является родительской.

Лексическая среда - это среда функции, в которой она написана. То есть статический порядок / место, где он находится, независимо от того, откуда он вызывается.

Область действия переменной / функции - это, в основном, места, из которых переменная является видимой / доступной.

Контекст выполнения - это состояние стека выполнения в любой точке во время выполнения. Это текущий контекст выполнения.

Вот что спецификация говорит о лексических средах:

Лексическая среда - это тип спецификации, используемый для определения ассоциации идентификаторов с конкретными переменными и функциями на основе лексической структуры вложенности кода ECMAScript. Лексическая среда состоит из Записи среды и, возможно, нулевой ссылки на внешнюю Лексическую среду.

Исходя из этого, я бы сказал, да, именно об этом обычно говорят люди, когда говорят "размах".

Хотя, вероятно, можно утверждать, что "область действия" фактически определяется как " декларативная запись среды":

Каждая декларативная запись среды связана с областью программы ECMAScript, содержащей объявления переменных и / или функций. Декларативная запись среды связывает набор идентификаторов, определенных объявлениями, содержащимися в ее области видимости.

Если вы рассматриваете "область действия" как нечто, содержащее привязки между идентификаторами и значениями, то второе определение, вероятно, подходит лучше. Если вы думаете о нем как о чем-то, что знает об областях его предков, то первое определение подходит лучше.

Изменить: и третий вариант " Контекст выполнения".

Другие вопросы по тегам