2011-06-13 18 views
20

¿El término "objeto de activación" es simplemente otro nombre de "objeto variable" o existe alguna diferencia entre ellos? He estado leyendo algunos artículos de JavaScript sobre cómo se forman los ámbitos de variable en un contexto de ejecución, y desde mi punto de vista parece que en la mayoría de los artículos utilizan estos dos términos indistintamente.Activación y objeto variable en JavaScript?

+1

Nunca he oído hablar de "objeto variable".¿De dónde obtuviste esa designación? – Zecc

+3

Zecc - ES3 § 10.1.3 Instanciación de variables: "Cada contexto de ejecución tiene asociado un objeto variable". ES5 lo llama * VariableEnvironment * (ES5 § 10.3, tabla 19), la redacción es diferente, pero efectivamente es la misma: * Cuando se crea un contexto de ejecución, sus componentes LexicalEnvironment y VariableEnvironment tienen el mismo valor. * – RobG

Respuesta

17

Bueno, acabo de aprender algo :). De this article, parecería que dentro del contexto de ejecución de una función, el objeto de activación se utiliza como objeto variable:

Cuando un contexto de ejecución se crea una serie de cosas suceden en un orden definido. Primero, en el contexto de ejecución de una función, se crea un objeto "Activación". [...]

Luego, el proceso de "instanciación variable" se lleva a cabo utilizando un objeto al que el ECMA 262 se refiere como el objeto "Variable". Sin embargo, el objeto Activation se usa como el objeto Variable (obsérvese que es importante: son el mismo objeto). Las propiedades nominales del objeto Variable se crean para cada uno de los parámetros formales de la función, y si los argumentos de la llamada a función se corresponden con esos parámetros, los valores de esos argumentos se asignan a las propiedades (de lo contrario, el valor asignado no está definido).

Sin embargo, cuando estás en el ámbito global, no es un objeto de activación, por lo que el objeto global se utiliza como objeto variable en su lugar:

El contexto de ejecución mundial consigue un cierto ligeramente manejo diferente ya que no tiene argumentos por lo que no necesita un objeto de Activación definido para referirse a ellos. [...] El objeto global se utiliza como el objeto variable, por lo que las funciones declaradas globalmente se convierten en propiedades del objeto global.

Parece que "Activation Object" y "Variable Object" son lo mismo dentro de un contexto de función, pero no dentro del contexto global.

+4

+1 para referenciar Artículo de Richard Cornford. Tenga en cuenta que fue escrito antes de ES5, por lo que necesita una pequeña actualización. La parte relevante de ECMA-262 es § 10.4.1 que se refiere a * VariableEnvironment * y * LexicalEnvironment * en lugar de objeto variable y objeto de activación. – RobG

+0

Ah, siempre he sospechado que son lo mismo ... ahora estoy bastante seguro de que el objeto de activación se hereda del objeto variable. ¿Alguien dispuesto a confirmar eso? –

+0

Sí, se heredan de un objeto variable. Ambos son iguales de hecho. – Thalaivar

7

Un objeto activación es el objeto más superior en un alcance de cadena con el más inferior siendo objeto global. Considerando que variable objeto es un concepto abstracto y por lo tanto, dependiendo de su contexto de ejecución, es cualquier enlace en scope-chain incluyendo activación/objeto global.


Contiene:

  • todas las variables y funciones se declaran en el interior del cuerpo de la función;
  • argumentos denominados según lo especificado por la firma de la función;
  • argumentos como un objeto llamado arguments (en caso de que desee que su función sea compatible con varias firmas).

No contiene:

  • this (ya que no es una variable);
  • expresiones de función.

Más información - JavaScript. The core.

algunas citas en caso de tl; dr:

A objeto variable es un ámbito de datos relacionados con la ejecución contexto. Es un objeto especial asociado con el contexto y que almacena variables y declaraciones de funciones que se están definiendo dentro del contexto.

A objeto variable es un concepto abstracto . En diferentes tipos de contexto, físicamente, se presenta usando un objeto diferente.

[..] en el contexto global de la objeto variable es el objeto global sí [..]

[..] objeto variable de una función es la misma sencilla objeto variable , pero además de las variables y declaraciones de funciones, sino que también almacena los parámetros formales y arguments objeto, y se llama la Activa objeto de detención.

[..] cuando se accede a this en un código, su valor se toma directamente del contexto ejecución sin ningún -cadena de ámbito de búsqueda.

+0

¿Puede mostrarnos algún código fuente en cada caso? –

0

Es más exacto decir que un objeto de Activación es un tipo de objeto Variable. Esto es similar a como un hombre es un tipo de HUMANO. Como se indica here, el término 'Objeto variable' es simplemente un término GENERALIZADO que se utiliza para describir cualquier objeto que contiene las propiedades que describen el entorno y el alcance del contexto que se está ejecutando actualmente.

Por lo tanto, dentro del contexto de ejecución global (es decir, fuera de cualquier función), termina siendo el objeto Global. ¿Por qué? Porque es el objeto que posee las propiedades que describen el entorno y el alcance del contexto de ejecución global.

Considerando que dentro de la función contexto de ejecución local (es decir, dentro de una función), es el objeto local de función (también conocido como el objeto Activación) el objeto Variable, ya que es el objeto que contiene las propiedades que describen el entorno y alcance de la función actualmente en ejecución. Propiedades tales como argumentos de funciones, por ejemplo.

Cuestiones relacionadas