Подтвердить что ты не робот

Активация и переменный объект в JavaScript?

Является ли термин "объект активации" просто другим именем "переменного объекта" или существует ли какая-либо разница между ними? Я читал несколько статей JavaScript о том, как изменяются области видимости в контексте выполнения, и с моей точки зрения кажется, что в большинстве статей они используют эти два термина взаимозаменяемо.

4b9b3361

Ответ 1

Хорошо, я только что узнал что-то:). Из этой статьи видно, что в контексте выполнения функции объект активации используется как объект переменной:

При создании контекста выполнения происходит несколько событий в определенном порядке. Во-первых, в контексте выполнения функции создается объект "Активация". [...]

Затем процесс "экземпляра переменной" выполняется с использованием объекта, который ECMA 262 называется объектом "Variable". Однако объект Activation используется как объект Variable (обратите внимание, что это важно: они являются одним и тем же объектом). Именованные свойства объекта Variable создаются для каждого из формальных параметров функции, и если аргументы вызова функции соответствуют этим параметрам, значения этих аргументов присваиваются свойствам (иначе назначенное значение равно undefined).

Однако, когда вы находитесь в глобальной области действия, нет объекта активации, поэтому вместо этого объект Глобальный объект используется вместо объекта переменной:

Глобальный контекст выполнения получает несколько немного отличающуюся обработку, так как он не имеет аргументов, поэтому для обращения к ним не требуется определенный объект Activation. [...] Глобальный объект используется как объект Variable, поэтому глобально объявленные функции становятся свойствами глобального объекта.

Таким образом, это звучит так: "Объект активации" и "Объект переменной" - одно и то же в контексте функции, но не в глобальном контексте.

Ответ 2

Объект активации - это самый верхний объект в цепочке областей с наименьшим объектом глобальный объект. В то время как объект переменной является абстрактным понятием и поэтому, в зависимости от его контекста выполнения, есть любая ссылка в цепочке областей, включая активация/глобальный объект.


Он содержит:

  • все переменные и функции, которые вы объявляете внутри тела функции;
  • аргументы, указанные в соответствии с сигнатурой функции;
  • как объект с именем arguments (если вы хотите, чтобы ваша функция поддерживала несколько подписей).

Он не содержит:

  • this (поскольку это не переменная);
  • названные функциональные выражения.

Дополнительная информация - JavaScript. Ядро.

Несколько цитат в случае tl; dr:

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

Объект - это абстрактное понятие. В разных контекстах, физически, он представлен с использованием другого объекта.

[..] в глобальном контексте объект переменной - это глобальный объект сам [..]

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

[..] при доступе к this в коде, его значение берется непосредственно из контекста выполнения без какого-либо поиска по цепочке.

Ответ 3

Более точно сказать, что объект Activation является типом объекта Variable. Это похоже на то, как человек является типом ЧЕЛОВЕКА. Как указано здесь, термин "переменный объект" - это просто GENERALIZED термин, используемый для описания любого объекта, который содержит свойства, описывающие среду и область действия текущий исполняемый контекст.

Следовательно, в глобальном контексте выполнения (т.е. вне любых функций) он становится объектом Global. Зачем? Потому что это объект, который содержит свойства, описывающие среду и область действия глобального исполняемого контекста.

В то время как внутри локального исполняемого контекста функции (т.е. внутри функции), это локальный объект функции (также известный как объект активации), который является объектом Variable, так как он является объектом, который содержит свойства, описывающие среду и область действия выполняемой в настоящее время функции. Такие свойства, как аргументы функции, например.