español ejemplos descargar definicion curso caracteristicas javascript

ejemplos - javascript html



¿Cuál es el ''Contexto de ejecución'' en JavaScript exactamente? (7)

El "Contexto de ejecución" es un paraguas que envuelve todo el código para ayudar a administrarlo. 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.

Mi título lo resume todo.

¿Alguien puede iluminarme en ...

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

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


El contexto de ejecución es un contenedor para ayudar a administrar el código que se está ejecutando. En su código verá muchos entornos léxicos, significa que las áreas del código entre {} pero que se está ejecutando actualmente se gestionan a través de contextos de ejecución. Puede contener su código y también puede contener más allá de lo que has escrito en tu código.


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

El contexto de ejecución es un concepto en la especificación del lenguaje que, en términos simples, equivale aproximadamente al "entorno" en el que se ejecuta una función; es decir, el alcance variable (y la cadena de alcance , las variables en cierres desde ámbitos externos), los argumentos de función y el valor de this objeto.

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

Ver también esta respuesta y este artículo .

El alcance es literalmente eso: el alcance en el que se puede acceder a una variable. Simplificadamente:

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 de alcance )

En contraste, solo se puede acceder a y mediante el código en a() porque está limitado al alcance de un objeto. Esto es lo que hace la palabra clave var : restringe una variable al alcance local. Si omitimos var , y terminaría en el ámbito global , generalmente considerado como algo malo.

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

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

La llamada a a() tendrá éxito porque su declaración se izó a la parte superior; a fue asignado 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.


Ha pedido tantos conceptos, pero vamos a elegir uno por uno y entenderlos.

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

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

  1. Objeto global - window
  2. Objeto especial this
  3. Ref. Al ambiente exterior

Veamos un ejemplo simple para comprender Global Execution Context :

var a = "Hello World"; function b(){ }

Cuando JS Engine ejecuta este código anterior, crea el siguiente contexto de ejecución (que se muestra en la imagen): contexto de ejecución global

Ahora veamos cómo JS Engine crea el Execution Context (entonces vamos a desenterrar y entender el izado): considere este escenario:

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

Puedo llamar a la función b() aunque se declare más tarde. Esto significa que JS Engine está haciendo algo antes de que se ejecute mi código, veamos qué:

JS Engine realiza los siguientes dos pasos para ejecutar cualquier código:

FASE DE CREACIÓN :

  • Análisis de JS Engine: ejecuta tu código e identifies variables & functions creadas por código (que se usará en la fase de ejecución)
  • Configurar espacio de memoria para variables y funciones - "elevación"
  • Alzamiento : antes de que se ejecute el código, el motor de JS establece el espacio de memoria para Var & Func utilizado dentro del código. Estas variables y 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 simple de entender,

  • Cuando el código se ejecuta línea por línea (por JS interpreeter) puede acceder a las variables definidas en Contexto de ejecución
  • la asignación de variables se realiza en esta fase

Se crea un nuevo Contexto de Ejecución cuando la invocación de la función está allí

Pila de contexto de ejecución: ¿Qué sucede cuando invocas una función?

function b(){ } function a(){ b(); } a();

  • Ahora, ante todo, se creará el Global Execution Context (como se explicó anteriormente)

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

    de modo que cada vez que invoque una función, se creará una EC nueva y se colocará sobre la Pila EC.

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

  • luego intrepreeter encuentra call to function b() , esto crea otra EC que se empuja hacia arriba o la pila EC

  • Cuando b() termine, se despegará de la pila y a() terminará y bajará a Global EC

ver Pila de ejecución para el fragmento de código anterior


He abordado solo los temas que están más estrechamente relacionados.

El Contexto de Ejecución es el envoltorio alrededor de su código existente; que contiene código que no has escrito ; pero es generado por el motor JS.

Se compone de lo siguiente -

  1. Objeto global
  2. ''esta''
  3. Ambiente exterior
  4. Tu código

Se crea un contexto de ejecución cada vez que ejecuta su archivo / aplicación .js. El primer paso en esta fase de creación es izado . 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í, se accede a la función b () y a la variable a antes de que se definan, sin embargo, debido a la elevación, la consola no arrojará ningún error.

La salida se verá como - (pruébalo)

calling function undefined

Observe cómo se ejecutó la función por completo, pero no hemos definido para la variable. Esto se debe a que el Levantamiento se realiza de forma diferente para las funciones frente a las variables. La función como un todo se recoge en la memoria, pero para las variables, el espacio se reserva como un marcador de posición con el valor de 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 ti.


Me gustaría dirigirme

  1. Contexto
  2. este contexto (relación con el contexto)
  3. Alcance

1: contexto de ejecución

JavaScript es un lenguaje de un solo hilo, lo que significa que solo se puede ejecutar una tarea a la vez. Cuando el intérprete de JavaScript ejecuta código inicialmente, primero entra en un contexto de ejecución global de manera predeterminada . Cada invocación de una función desde este punto dará como resultado la creación de un nuevo contexto de ejecución.

Aquí es donde a menudo se establece la confusión, el término " contexto de ejecución" se refiere en realidad a todos los efectos y se refiere más al alcance y no al contexto. Es una desafortunada convención de nombres, sin embargo, es la terminología definida por la especificación ECMAScript, por lo que estamos un poco atascados con ella.

Cada vez que se crea un nuevo contexto de ejecución , se anexa a la parte superior de la pila de ejecución. El navegador siempre ejecutará el contexto de ejecución actual que está encima de la pila de ejecución. Una vez completado, se eliminará de la parte superior de la pila y el control volverá al siguiente contexto de ejecución.

Un contexto de ejecución se puede dividir en una fase de creación y ejecución. En la fase de creación, el intérprete primero creará un objeto variable (también llamado objeto de activación) que se compone de todas las variables, declaraciones de funciones y argumentos definidos dentro del contexto de ejecución. A partir de ahí, la cadena del alcance se inicializa a continuación, y el valor de esto se determina al final. Luego, en la fase de ejecución, el código es interpretado y ejecutado.

2: este contexto

¿Qué es "este" contexto? El contexto generalmente se determina por la forma en que se invoca una función. Cuando se llama a una función como método de un objeto, se establece en el objeto al que se llama el método:

var obj = { foo: function() { return this; } }; obj.foo() === obj; // true

El mismo principio se aplica cuando se invoca una función con el nuevo operador para crear una instancia de un objeto. Cuando se invoca de esta manera, el valor de esto dentro del alcance de la función se establecerá en la instancia recién creada:

function foo() { alert(this); } foo() // window new foo() // foo

Cuando se llama como una función independiente, esto se establecerá de forma predeterminada en el contexto global u objeto de ventana en el navegador. Sin embargo, si la función se ejecuta en modo estricto, el contexto se definirá por defecto como indefinido.

3: alcance variable

Una variable se puede definir en el ámbito local o global , que establece la accesibilidad de las variables desde diferentes ámbitos durante el tiempo de ejecución. Cualquier variable global definida, es decir, cualquier variable declarada fuera de un cuerpo de función vivirá durante el tiempo de ejecución y se puede acceder y modificar en cualquier ámbito. Las variables locales existen solo dentro del cuerpo de la función del cual están definidas y tendrán un alcance diferente para cada llamada de esa función. Allí está sujeto a la asignación, recuperación y manipulación de valores solo dentro de esa llamada y no es accesible fuera de ese alcance.

ECMAScript 6 (ES6 / ES2015) introdujo las palabras clave let y const que admiten la declaración de variables locales de alcance de bloque. Esto significa que la variable se limitará al alcance de un bloque en el que está definida, como una instrucción if o un ciclo, y no será accesible fuera de las llaves de apertura y cierre del bloque. Esto es contrario a las declaraciones var que son accesibles fuera de los bloques en los que están definidas. La diferencia entre let y const es que una declaración const es, como su nombre lo indica, constante: una referencia de solo lectura a un valor. Esto no significa que el valor sea inmutable, solo que el identificador de la variable no puede ser reasignado .

Para otros temas: GC: GC Prototyping: Prototyping


Supongo que un simple ejemplo explicaría todo.

Nota: function.call(object) llama función function en 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)