"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Contexto de ejecución y pila de llamadas

Contexto de ejecución y pila de llamadas

Publicado el 2024-11-08
Navegar:384

Execution Context & Call Stack

Creación de contexto de ejecución global para el código de nivel superior, es decir, código que no está dentro de ninguna fn. Por lo tanto, el código fuera de fn se ejecuta primero.
El código dentro del cuerpo fn de fn-decln/exprsn solo se ejecuta cuando se llama.

Contexto de ejecución (CE)

Entorno en el que se ejecuta la parte de JS.
Almacena toda la información necesaria para que algún código se ejecute como variables locales, argumentos pasados ​​a fn.
El código JS siempre se ejecuta dentro de un EC.
Exactamente un EC global independientemente del tamaño del proyecto JS.
Contexto predeterminado, creado para código que no está dentro de ninguna fn.
Luego el código se ejecuta dentro del EC global
Después de ejecutar el código de nivel superior, ejecución de fns y espera de C/bs
Para cada llamada a fn, se crea un nuevo EC para ejecutar esa fn. Lo mismo ocurre con los métodos, ya que también son fns adjuntos a objetos.
Todos estos EC juntos forman la pila de llamadas.
Cuando se ejecutan todas las fns, el motor espera a que lleguen los CB y las ejecute. Ex. haga clic en devolución de llamada de evento, proporcionada por el bucle de eventos.

¿Qué hay dentro de la CE?

  1. Entorno variable que consta de
  2. declaraciones let, const, var
  3. Funciones
  4. objeto de argumentos: almacena todos los argumentos pasados ​​al fn en su EC.
    Cada fn obtiene su propia EC como se le llama. Y las variables declaradas terminan en un entorno variable

  5. Cadena de alcance:
    Fns puede acceder a variables fuera de fns usando la cadena de alcance.
    Contiene referencias a las variables ubicadas fuera del fn actual y para realizar un seguimiento de la cadena de alcance, se almacena en cada EC.

  6. Cada EC también obtiene la palabra clave 'this'.

Los tres anteriores se generan durante la "Fase de creación", justo antes de la ejecución. Estas son las cosas necesarias para ejecutar el código en el nivel superior.

Para flecha fns EC:

No tendremos: objeto de argumentos, esta palabra clave. Los fns de flecha usan desde su fn regular más cercano, los dos anteriores.

argumentos: objeto similar a una matriz, que contiene todos los argumentos pasados ​​al fn normal, no al fn de flecha.

Montón de memoria de pila de llamadas = motor JS

Pila de llamadas

Lugar donde los EC se apilan uno encima del otro, para realizar un seguimiento de dónde estamos en la ejecución. El EC más alto es el que estamos ejecutando. Cuando finaliza la ejecución, se elimina de la parte superior de la pila y el control se transfiere al EC subyacente.
Si hay una llamada fn anidada, la llamada fn externa se pausará para devolver el resultado de la ejecución de la fn interna en la pila de llamadas, ya que JS solo tiene un hilo de ejecución. Ahora el EC anterior se convertirá en el EC activo
Luego, el EC superior sale de la pila de llamadas cuando se devuelve.
Lo más bajo en la pila de llamadas será EC global, encima estarán las llamadas fn a medida que ocurren en orden.
Garantiza que el orden de ejecución nunca se pierda.
Al final, el programa finalizará y EC global también aparecerá en la pila de llamadas.

El código JS se ejecuta dentro de un EC, que se coloca en Call Stack.

Hence, we can say that each EC has:
1. Variable environment
2. Scope chain
3. 'this' keyword

Alcance

Cómo JS Engine organiza y accede a las variables de nuestro programa.
¿Dónde viven las variables
¿Dónde podemos acceder a determinadas variables y dónde no?

Alcance léxico:

JS tiene alcance legal, lo que significa que el alcance se controla mediante la ubicación de fns y bloques en el código.
Ex. Una fn anidada tiene acceso a las variables de su fn principal.

Alcance:

Espacio o env en el que se declara una determinada variable (entorno variable en caso de fns). Es la variable env que está almacenada en fns EC.
Para fns, Var env y alcance son iguales.

Three scopes in JS are:
1. Global scope
2. Fn scope
3. Block scope [ES6]

El alcance es un lugar donde se declaran las variables. Por lo tanto, esto también es cierto para Fns, ya que los fns son solo valores almacenados en variables.

Alcance de una variable

Región de nuestro código donde se puede acceder a una determinada variable.

El alcance es diferente del alcance de una variable con diferencias sutiles.

## Global Scope:
For top level code
For variables declared outside of any fn or block which are accessible from everywhere
Variables in this scope are at the top of scope chain. Hence, can be used by every nested scope.
## Fn Scope:
Each fn has creates its own scope
Variables are accessible ONLY inside fn, NOT outside. Else Reference Error
Also called local scope
Fn decln, exprsn, arrow all three create their own scopes.
Only way to create scope using ES5 which had only fn & global scope.
## Block Scope:
Introduced in ES6, not only fn but {} also create a scope known as block scope which work only for ES6 variables i.e let-const types. DOesn't work for variables declared with 'var' as its fn scoped.
Variables accessible only inside block i.e {} 
This only applies to variables declared with let-const only.
Fns are also block scoped in ES6 (only in strict mode, should be used)
variables declared using 'var' will be accessible outside the block
Scoped to the current fn or the global scope.
var variables only care about fn, they ignore blocks. They end up in nearest fn scope.

Cada alcance anidado tiene acceso a variables desde su alcance externo y el alcance global. Lo mismo se aplica también a los argumentos fn.

Si un fn no encuentra la variable en su alcance, busca la cadena de alcance para encontrar las variables en sus alcances externos. Este proceso se llama búsqueda de variables en la cadena de alcance. Esto no funciona al revés, es decir, no podemos acceder a variables o ámbitos fn anidados desde fuera de fn o de los ámbitos externos.
Los ámbitos hermanos no pueden acceder a las variables de cada uno
Sólo el ámbito más interno puede acceder a sus ámbitos externos, no al revés.

Un EC por cada fn en el orden exacto en que se llama un fn se coloca en la pila de llamadas con sus variables dentro del EC. Global EC está al final de la pila de llamadas

Cadena de alcance:
Se trata del orden en que se escriben fns en el código.
No tiene nada que ver con el orden en que se llamaron a los fns.
La cadena de alcance obtiene el entorno variable de la CE.
El orden de las llamadas fn no es relevante en absoluto para la cadena de alcance.

const a = 'Alice';
first();

function first(){
  const b = "Hello";
  second();

  function second(){
    const c = "Hi";
    third();
  }
}

function third(){
  const d = "Hey";
  console.log(d   c   b   a); // Reference Error
}

## Call Stack order:
third() EC - top
second() EC
first() EC
global EC - bottom


Scope Chain:
second() --nested inside--> first() --nested inside--> global scope.
third() is independently defined inside gloabal scope.

Reference Error occurred because both 'c' as well as 'b' cannot be accessed using the scope chain.

Resumen:
E-C, Var Env, Cl-Sk, Scope, Scope-chain son conceptos diferentes pero relacionados.
El alcance plantea preguntas sobre dónde residen las variables, dónde podemos acceder a ellas y dónde no.
Alcance léxico en JS: las reglas sobre dónde podemos acceder a las variables se basan exactamente en qué parte del código están escritos fns y bloques.
Cada ámbito tiene acceso a todas las variables de todos sus ámbitos externos. Esta es una cadena de alcance que es una calle de sentido único. Un ámbito externo nunca puede acceder a variables de ámbito interno.
La cadena de alcance de un determinado alcance equivale a sumar todos los Var Envs de todos los ámbitos principales.
La cadena de alcance no tiene nada que ver con el orden en que se llama a fns. No afecta en absoluto la cadena de alcance.
Cuando una variable no se encuentra en el alcance actual, el motor busca en la cadena de alcance hasta que encuentra la variable que busca. Esto se llama búsqueda de variables.

Declaración de liberación Este artículo se reproduce en: https://dev.to/mahf001/execution-context-call-stack-29kp?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3