2012-02-21 19 views
40

Mi título prácticamente lo resume todo.¿Cuál es exactamente el 'Contexto de ejecución' en JavaScript?

Puede alguien me ilumine sobre ...

"¿Cuál es el 'contexto de ejecución' en JavaScript?"

y en cómo se relaciona con 'esto', elevación, prototipo de encadenamiento, alcance y recolección de basura?

+1

Probablemente necesite definir ** Contexto de ejecución ** – jondavidjohn

+5

@jondavidjohn: * El contexto de ejecución * tiene un significado específico dentro de [ECMA-262] (http://bclary.com/2004/11/07/#a- 10). – josh3736

+0

@ josh3736 gracias! – jondavidjohn

Respuesta

40

Estás preguntando por varios conceptos diferentes que no están muy estrechamente relacionados. Trataré de abordar brevemente cada uno.


contexto de ejecución es un concepto en la especificación de lenguaje que — — en términos sencillos equivale aproximadamente al 'medio ambiente' en una función ejecuta; es decir, ámbito de variable (y la cadena de ámbito , variables en cierres desde ámbitos externos), argumentos de función y el valor del objeto this.

La pila de llamadas es una colección de contextos de ejecución.

Vea también this answer y this article.


Alcance es literalmente que: el alcance en el que se puede acceder a una variable. Simplista:

var x; 

function a() { 
    var y; 
} 

x se puede acceder desde cualquier lugar. Cuando se invoca a, x estará en el ámbito externo. (Almacenado en la cadena alcance.)

En contraste, y sólo se puede acceder por código en a() porque se limita a alcance a 's. Esto es lo que hace la palabra clave var: restringe una variable al alcance local. Si omitimos var, y terminaría en el alcance global , generalmente considerado como algo malo.


Piense en de elevación a medida que más de una cosa en tiempo de compilación. En JavaScript, las declaraciones de función se "levantan" al principio de su ámbito. En otras palabras, se analizan y evalúan antes de cualquier otro código. (Esto se opone a la función expresiones, que se evalúan en línea.) Considere lo siguiente:

a(); 
b(); 

function a() { } 
var b = function() { } 

La llamada a a() tendrá éxito debido a que su declaración fue izada a la parte superior; a se asignó automáticamente antes de que comenzara la ejecución del programa. La llamada a b() fallará con un TypeError porque b no se definirá hasta la línea 4.

+15

En realidad, con respecto a su parte al levantar, la declaración de la variable 'b' también será izada: se declarará desde el principio, pero no se le asignará ningún valor antes de la línea 4. Llamar a' b() 'antes de la línea 4 de hecho dará como resultado un error, pero uno diferente: intentaremos ejecutar 'undefined', que no es una función. – Pioul

+0

@ josh3736 Me gusta mucho su respuesta, pero no entiendo qué es lo que hace que la pila cambie contextos como en una función asincrónica o en un ciclo while donde aparentemente no funciona. –

-2

Supongo que un simple ejemplo explicaría todo.

Nota: function.call(object) llamadas a funciones function en el contexto de object

// HTML 

​<p id="p"></p>​​​​​​​​​​​​​​​​​​​​​​​​ 

// JavaScript 

function helloWorld() { 
    alert("HelloWorld: " + this); 
} 

var p = document.getElementById("p"); 
helloWorld();    // HelloWorld: [object DOMWindow] 
helloWorld.call(window);  // HelloWorld: [object DOMWindow] 
​​​​​​helloWorld.call("String"); // HelloWorld: String // Note: "toString()" 
helloWorld.call​​​​(p);   // HelloWorld: [object HTMLParagraphElement] 
helloWorld.call(new Date());​​​​ // HelloWorld: Tue Feb 21 2012 21:45:17 GMT+0100 (Central Europe Standard Time) 
+5

Esta respuesta no está clara ....... – Pacerier

+0

Esta respuesta es muy informativa. call() es una propiedad del prototipo de función. Se puede invocar en cualquier función.Como helloWorld() básicamente hace un var_dump() del objeto pasado esta propiedad, se le informará el valor de esto para cualquier valor que pase. ... y eso es lo que a veces es difícil con respecto a javascript. Es fácil perder su lugar en la cadena de alcance. – shotdsherrif

+1

El OP preguntó acerca del "contexto de ejecución" no del "contexto". 'Contexto de ejecución' tiene una definición muy específica en la especificación de ECMAScript que incluye 'Entornos léxicos', referencia de entorno léxico 'externo', 'Registros de entorno', la pila, control de programa y la propiedad interna [[Ámbito]] en las funciones. – user2312341

-3

contexto de ejecución es una envoltura para ayudar a manejar el código que ejecuta En su código verá mucho de la de los ambientes léxicos: las zonas de el código entre {} pero que se está ejecutando actualmente se gestiona a través de contextos de ejecución. Puede contener su código y también puede contener más allá de lo que ha escrito en su código.

2

Me he dirigido a solo los temas que están más estrechamente relacionados.

Contexto de ejecución es el contenedor alrededor de su código existente; que contiene el código que no ha escrito; pero es generado por el motor JS .

Se compone de los siguientes -

  1. objeto global
  2. 'esto'
  3. entorno exterior
  4. Su código

un Exec El contexto se crea cada vez que ejecuta su archivo/aplicación .js. El primer paso en esta fase de creación es Alzando. El motor JS reserva espacio o establece la memoria para todas las variables y funciones definidas en su código. A continuación, se accede a ellos cuando el código se ejecuta línea por línea.

Por ejemplo:

b(); 
console.log(a); 
var a = "hi!"; 
function b() { 
    console.log("calling function"); 
} 

Aquí, el función b() y variable a están ambos acceder antes de que se definen, sin embargo, debido a izado la consola no lanzar cualquier error .

La salida se parecerá - (probarlo)

calling function 
undefined 

Aviso cómo la función se ejecuta por completo, pero tenemos indefinido para la variable. Esto se debe a que Alzado se realiza de forma diferente para funciones vs variables. La función como un todo se recoge en la memoria, pero para las variables, el espacio se reserva como marcador de posición con el valor indefinido. El valor real se reemplaza cuando el motor ejecuta su código línea por línea.

Espero que esto aclare el concepto para usted.

1

Has pedido tantos conceptos, pero vamos a elegir uno por uno & comprendedlos.

El entorno en el que se ejecuta el código es Execution context. Se crea cuando se ejecuta su código.

Execution Context (Global), creado por JS motor contiene 3 cosas importantes para usted:

  1. Global objeto - window
  2. objeto especial this
  3. árbitro ambiente externo

vamos a ver un simple ejemplo para comprender Global Execution Context:

var a = "Hello World"; 

function b(){ 

} 

Cuando JS El motor funciona este código anterior crea siguiente contexto de ejecución (que se muestra en la imagen): Global Execution Context


Ahora vamos a ver cómo crea JS Motor Execution Context (continuación vamos a desenterrar & entender de elevación) : en cuenta este escenario:

b(); 
console.log(a); 

var a = "Hello World!"; 
function b(){ 
    console.log("Called b!"); 
} 

me puede llamar a la función b() aunque es d eclared más tarde. Esto significa JS motor está haciendo algo antes de que se ejecute el código, le permite ver lo que:

JS motor realiza siguiendo dos pasos para durante la ejecución de cualquier código:

CREACIÓN FASE:

  • JS Análisis del motor: ejecute el código & identifies variables & functions creado por código (que se usará en la fase de ejecución)
  • Espacio de memoria de configuración para las Variables & Funciones - "Elevadores"
  • Elevadores - antes de ejecutar el código, el motor de JS establecen espacio de memoria apartes de Var & Func utilizado en el código. Estas variables & funciones comprenden el contexto de ejecución de cualquier función que se ejecute. Todas las variables en JS se configuran inicialmente como indefinidas.

Fase de Ejecución: bastante sencillo de entender,

  • Cuando el código se ejecuta línea por línea (por JS interpreeter) puede acceso a las variables definidas dentro del contexto de ejecución
  • asignación de variable se realizan en esta fase

Una nueva ejecución Co ntext se crea cada vez que la función de invocación es no

Contexto de ejecución de pila: ¿Qué ocurre cuando se invoca una función:

function b(){ 

} 

function a(){ 
    b(); 
} 

a(); 
  • Ahora en primer lugar Global Execution Context va a ser creado (como se explicó anteriormente)

  • luego se inicia la ejecución y se interpreta er encuentra con call to function a() y here a new execution context is created pushed on top EC Stack

    por lo que en cualquier momento de invocar una función de una nueva CE se crea & colocado en la parte superior de la pila CE.

  • por lo que ahora EC for a() es CREATED interpreeter ejecutará el código dentro a() línea por línea

  • entonces intrepreeter encuentra call to function b(), esto crea otro EC que se empuja en la parte superior o EC pila

  • Cuando termina b(), se abrirá la pila y luego a() terminará & todo el camino a Global EC

see Execution Stack for above code snippet

+0

Para obtener más información, consulte aquí http://davidshariff.com/blog/what-is-the-execution-context-in-javascript/ –

0

El "contexto de ejecución" es un paraguas que envuelve todo el código que ayudan a controlarla. Es como un gerente que maneja cualquier entorno. Dado que hay tantos entornos léxicos porque en una aplicación de JavaScript tiene muchas variables y funciones, necesita una forma de administrarlo todo. Lo que viene primero, lo que viene en segundo lugar y todo lo demás, y si no tienes un entorno de "Contexto de ejecución", todo se va al infierno. Por lo tanto, considere el "Contexto de ejecución" como un contenedor, un administrador que administra su código.

Cuestiones relacionadas