Активация и переменный объект в JavaScript? - PullRequest
22 голосов
/ 14 июня 2011

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

Ответы [ 4 ]

19 голосов
/ 14 июня 2011

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

Когда создается контекст выполнения, происходит ряд вещей в определенном порядке. Сначала в контексте выполнения функции создается объект «Активация». [...]

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

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

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

Похоже, что «объект активации» и «объект переменной» - это одно и то же в контексте функции, но не в глобальном контексте.

9 голосов
/ 24 января 2014

Объект активации является самым верхним объектом в цепочке областей действия , причем самый нижний из них - глобальный объект . Принимая во внимание, что переменный объект является абстрактным понятием и, следовательно, в зависимости от контекста его выполнения является любой ссылкой в ​​ scope-chain , включая активация / глобальный объект .


Содержит:

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

Не содержит:

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

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

Несколько кавычек в случае tl; dr :

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

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

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

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

[..] при обращении к this в коде его значение берется непосредственно из контекста без поиска scope-chain .

0 голосов
/ 25 декабря 2018

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

0 голосов
/ 08 августа 2015

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

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

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

...