Лексическая среда и область действия

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

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

Сфера действия переменной/функции - это, в основном, места, где переменная видима/доступна.

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

Ответ 4

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

Базовая реализация в JavaScript выглядит следующим образом:

const memoize = fn => {
  const cache = new Map()
  return value => {
    const cachedResult = cache.get(value)
    if (cachedResult !== undefined) 
      return cachedResult
    const result = fn(value)
    cache.set(value, result)
    return result
  }
}

Это пример лексической области видимости, слово " лексическая " относится к тому факту, что лексическая область видимости использует место, где переменная объявляется в исходном коде, чтобы определить, где эта переменная доступна. Вложенные функции имеют доступ к переменным, объявленным в их внешней области видимости.

Причина в том, что функции в JavaScript закрывают формы. Закрытие - это сочетание функции и лексической среды, в которой эта функция была объявлена. Эта среда состоит из любых локальных переменных, которые находились в области действия во время создания замыкания.