Entorno Global y Contexto de Ejecución en JavaScript

Entorno Global y Contexto de Ejecución en JavaScript

Introducción

Entorno lexico & Contexto de ejecucion – Israel Morales Marin – Web  Developer from St. Petersburg, Florida

El entorno global y el contexto de ejecución son conceptos clave para entender cómo funciona JavaScript internamente. Estos términos se refieren al modo en que el código se ejecuta y gestiona en diferentes niveles, lo que afecta directamente el comportamiento de las variables, funciones y el flujo del programa. En este artículo, exploraremos qué es el Global Environment (entorno global) y el Execution Context (contexto de ejecución), cómo trabajan juntos, y por qué son importantes para el desarrollo en JavaScript.

¿Qué es el Global Environment (Entorno Global)?

El Global Environment o entorno global es el espacio más alto de ejecución en JavaScript. Cuando se carga un archivo o script en una página web, se crea un entorno global donde se almacenan todas las variables y funciones que no están dentro de un bloque o función. En otras palabras, cualquier variable o función declarada en el nivel más alto del código, fuera de cualquier función, pertenece al entorno global.

El objeto global

En el entorno global del navegador, todas las variables y funciones globales están unidas al objeto window. En Node.js, el equivalente es el objeto global. Esto significa que cualquier cosa que se declare en el entorno global se puede acceder desde el objeto global.

Ejemplo en un entorno de navegador:

				
					var nombre = "Juan";
console.log(window.nombre); // Imprime "Juan"
				
			

En Node.js, funcionaría de esta manera:

				
					var nombre = "Juan";
console.log(global.nombre); // Imprime "Juan"
				
			

¿Qué es el Execution Context (Contexto de Ejecución)?

El Execution Context o contexto de ejecución es una estructura que se crea cada vez que el código JavaScript se ejecuta. El contexto de ejecución define el entorno en el que se ejecuta el código, qué variables están disponibles, y cómo se manejan las funciones.

Hay diferentes tipos de contextos de ejecución:

  1. Contexto de Ejecución Global: Es el contexto de ejecución creado cuando JavaScript comienza a ejecutarse. Se asocia con el entorno global.
  2. Contexto de Ejecución de Funciones: Cada vez que se llama a una función, se crea un nuevo contexto de ejecución.
  3. Contexto de Ejecución de Eval: Se crea cuando se ejecuta una expresión con eval(), aunque este es un caso poco frecuente.

Fases del Contexto de Ejecución

Cada contexto de ejecución pasa por dos fases:

  1. Fase de Creación: Aquí, el motor de JavaScript crea el contexto de ejecución. Se asignan los objetos arguments, se realiza la hoisting (elevación) de variables y funciones, y se establece el valor de this (el objeto en el que se ejecuta el código).
  2. Fase de Ejecución: Una vez que el contexto está listo, el motor de JavaScript empieza a ejecutar el código línea por línea.

Componentes del Execution Context

Cada contexto de ejecución tiene tres componentes esenciales:

1. Variable Object (VO) / Activation Object (AO)

Es un objeto que contiene todas las variables, parámetros y funciones que se declaran en ese contexto. En el contexto de ejecución global, el Variable Object es el mismo que el objeto global.

2. Scope Chain (Cadena de Alcance)

La cadena de alcance es una lista de todos los objetos de ámbito al que tiene acceso el contexto de ejecución actual. Esta cadena incluye el contexto global, el contexto de la función y, en caso de funciones anidadas, los contextos de ejecución padre. La cadena de alcance asegura que JavaScript pueda encontrar variables en ámbitos anidados.

3. this

El valor de this depende de cómo y dónde se ejecuta el código. En el contexto global, this se refiere al objeto global (como window en navegadores). En el contexto de una función, this puede cambiar dependiendo de cómo se llame la función.

Relación Entre Global Environment y Execution Context

Cuando ejecutas un script de JavaScript, el primer contexto de ejecución que se crea es el contexto global. Este contexto incluye todas las variables y funciones globales, y es el primer nivel de la cadena de alcance. Posteriormente, cada vez que se invoca una función, se crea un nuevo contexto de ejecución de función. Cada uno de estos contextos tiene acceso al entorno global a través de la cadena de alcance.

Ejemplo

				
					var x = 10;

function sumar(a, b) {
  return a + b + x; // Accede a 'x' desde el contexto global
}

console.log(sumar(5, 7)); // Imprime 22
				
			

En este ejemplo, el valor de x es parte del contexto global, y la función sumar tiene acceso a esa variable gracias a la cadena de alcance. Al invocar sumar(5, 7), se crea un contexto de ejecución de función que incluye los parámetros a y b, y luego accede a x en el contexto global.

Hoisting en el Contexto de Ejecución

El concepto de hoisting es crucial para entender el contexto de ejecución. Durante la fase de creación de un contexto, JavaScript «eleva» (hoists) las declaraciones de variables y funciones al principio del contexto, lo que significa que puedes usar funciones y variables antes de declararlas.

Ejemplo:

				
					console.log(nombre); // undefined, debido al hoisting
var nombre = "María";
console.log(nombre); // Imprime "María"

				
			

En este ejemplo, aunque la variable nombre no ha sido asignada antes de la primera llamada, JavaScript la «eleva» y la declara en la fase de creación del contexto, aunque su valor inicial es undefined hasta que se le asigna un valor.

El Ciclo de Vida del Contexto de Ejecución

El contexto de ejecución no es permanente. Cuando el código en un contexto se completa, ese contexto es destruido, a menos que haya referencias activas a las variables o funciones definidas en ese contexto (por ejemplo, en el caso de closures o cierres). El motor de JavaScript crea y destruye contextos de ejecución dinámicamente a medida que se ejecuta el código.

Ejemplo de Closure

				
					function crearContador() {
  let contador = 0;
  return function() {
    contador++;
    console.log(contador);
  }
}

let contar = crearContador();
contar(); // 1
contar(); // 2
				
			

En este ejemplo, el contexto de ejecución de crearContador persiste debido al cierre creado por la función interna. Aunque crearContador ha finalizado su ejecución, las variables dentro de su contexto siguen siendo accesibles gracias a la función interna.

Conclusión

El Global Environment y el Execution Context son fundamentales para comprender cómo se ejecuta el código en JavaScript. El entorno global es donde todas las variables y funciones globales residen, mientras que el contexto de ejecución define cómo y cuándo se ejecutan esas variables y funciones. Tener una comprensión sólida de estos conceptos te ayudará a escribir un código más eficiente y evitar errores comunes, como problemas de alcance o de this.

Links de referencias: Execution Context en Javascript: Guía completa sobre el entorno de ejecución en el lenguaje de programación más popular del mundoComprende JS: Entorno léxico y el contexto de ejecuciónContexto de ejecución de JavaScript y Hoisting explicados con ejemplos de código

Facebook
Twitter
LinkedIn

Post relacionados

Post recientes

Search