La función inner
se crea justo antes de que se ejecute la función anónima, mediante el proceso Variable Instantiation.
El [[Scope]]
de inner
cuando es ejecutado contiene:
- El objeto variable vacía de
inner
(está vacío porque no hay declaraciones de variables/funciones dentro de él)
- El objeto variable de la función anónima, que contiene
x
, y
y inner
.
- El objeto global, que contendrá
a
y otras propiedades ...
Global (3) Anonymous VO (2) inner VO (1)
________ ________ ________
| a = 1 | <--------- | x = 2 | < -------- | |
| ... | | y = 3 | ¯¯¯¯¯¯¯¯
¯¯¯¯¯¯¯¯ | inner |
¯¯¯¯¯¯¯¯
Editar: Para aclarar su segunda pregunta:
¿Cuál es la diferencia entre el contexto de ejecución y la cadena de ámbito de la función interior?
Son dos conceptos diferentes, se crea un contexto de ejecución justo antes de que se ejecute un fragmento de código (que es can be ya sea código global, código de función o código de evaluación).
Creo que esto podría ser más fácil de explicar con su código:
var a = 1;
(function(x) { // Step 1
function inner() {
alert(a);
alert(x);
alert(y);
}
var y = 3;
inner(); // Step 3
})(2); // Step 2
En el Paso 1, la función anónima es created, el alcance actual (sólo contiene el objeto global) se almacena en este momento en la propiedad de la función [[Scope]]
.
En el Paso 2, se ejecuta esta función anónima, un nuevo contexto de ejecución se crea (un function code execution context), en este momento se crea un nuevo entorno léxico (se crea la variable objeto de esta función), todas las funciones los identificadores de argumentos (en este caso solo x
), los identificadores de declaraciones de funciones (inner
) y los identificadores de declaraciones de variables (y
) están vinculados como propiedades no eliminables de este nuevo objeto variable (que es el nuevo alcance léxico).
En el Paso 3 se ejecuta la función inner
, esto crea un nuevo contexto de ejecución, otro objeto variable se inyecta en la cadena de ámbito, pero en este caso ya que nada está declarado dentro de inner
y no tener ningún parámetros formales, será solo un objeto vacío.
Ver también this respuesta, la primera parte hablo de la declaración with
pero en la segunda parte se trata de funciones.
contexto de ejecución se crea en tiempo de ejecución, la cadena de alcance se crea en el momento de la definición (no estoy seguro de que es el término correcto), mi pregunta es: ¿cuál es la diferencia entre el contexto de ejecución y la cadena de alcance de la función interna? ¿Cuál es el proceso de creación del contexto de ejecución? ¡Gracias! – nandin
@Ding: Sí, la cadena del alcance está dictada por el lugar donde se define la función. Al mirar una función en la fuente, puede ver qué identificadores están dentro del alcance y de dónde provienen. Pero las funciones no tienen contextos de ejecución, solo * calls * para las funciones do. El contexto de ejecución incluye el objeto variable que forma el mecanismo de tiempo de ejecución de la cadena de alcance, así como otras cosas, como cuál debe ser el valor 'this'. Es evidente que tienes interés en saber realmente cómo funciona esto (¡lo cual es genial!) Y por eso solo puedo decir: lee la sección 10 (especialmente las 10.3 y 4) de la especificación para obtener más información. :-) –