JS: Objeto global

El objeto global de JavaScript es una de las piezas fundamentales del lenguaje. Se trata del objeto raíz a partir del cual derivan el resto de elementos, como variables, funciones y objetos que estén disponibles en el entorno de ejecución. Dicho de otro modo: este objeto es el contenedor principal del programa.

Entender cómo funciona este objeto es primordial para poder escribir un código más claro. A la vez, nos ayudará a evitar errores que puedan estar relacionados con el ámbito (scope) y la “contaminación” del espacio global.

El objeto global existe en todos los entornos de JavaScript, aunque su existencia puede ser ligeramente diferente. Por ejemplo, en los navegadores web es llamado window, mientras que en Node.js es conocido como global.

Es por esta razón que, por ejemplo, el objeto de la consola (console) depende de window en los navegadores web y de global en la terminal. Gracias al objeto global es posible acceder, de forma automática, a un gran abanico de métodos y funciones sin tener que importarlas ni declararlas.

Por ejemplo:

window.console.log('Hola');
global.console.log('Hola');

Aunque ambas sentencias son equivalentes a esta:

console.log('Hola');

En la versión ECMAScript 11 (ES11 o ES2020) se introdujo la propiedad universal globalThis con el fin de proporcionar una forma estándar y unificada de acceder al objeto global sin importar el entorno de ejecución.

El objeto global en el navegador

En los navegadores web (Chrome, Firefox o Safari) el objeto global es window. El nombre fue elegido con intencionalidad semántica, ya que en realidad representa la ventana del navegador. Muchos de los métodos y funciones que contiene están relacionados con la ventana del navegador, como la función alert().

Al declarar una variable mediante ‘var’, se añadirá de forma automática como propiedad de window. En cambio, las variables declaradas con let o const no se agregan al objeto global. Es una de las muchas razones por las que se recomienda usar let y const en contra de var.

Por ejemplo:

var saludo = "Hola con 'var'";
console.log(window.saludo);

En este caso, el resultado será «Hola con ‘var’», ya que al declarar la variable con var se añadió como propiedad del objeto window.

En este nuevo ejemplo, esto no ocurre:

let saludo = "Hola con 'let'";
console.log(window.saludo);

Ahora el resultado es «undefined».

El objeto global en Node.js

En el entorno de ejecución Node.js, el objeto global es global. En este caso, el nombre se ajusta más al contexto de la terminal; es obvio, ya que Node.js no tiene un contexto gráfico como los navegadores web.

Sin embargo, hay una diferencia importante respecto al objeto global del navegador: las variables declaradas en un archivo ejecutado por Node.js no se agregan de forma automática al objeto global; incluso si se declaran con var. Esto se debe a que cada archivo dentro de su propio módulo, encapsulado en una función interna. Esto evita la contaminación del espacio global.

Por ejemplo:

var saludo = "Hola de nuevo";
console.log(global.saludo);

El resultado será «undefined».

Esto ocurre porque la variable saludo pertenece solo al módulo actual en vez de pertenecer al objeto global. Esta decisión de diseño es la que consigue que el entorno de Node.js sea más seguro y modular.

La forma estándar ‘globalThis’

La propiedad universal globalThis soluciona el problema de compatibilidad entre plataformas y entornos de ejecución. Por lo tanto, actualmente constituye la forma estándar y recomendada de acceder al objeto global.

Esto significa que, tanto si estamos en un navegador web, como si estamos usando JavaScript en un entorno de ejecución como Node.js o Deno, podemos usar globalThis. Mientras estemos usando la versión de ECMAScript 11 o superior, ya no tendremos que preocuparnos por el contexto.

Por ejemplo:

globalThis.saludo = "Salutaciones";
console.log(globalThis.saludo);

En este caso, globalThis actúa como una referencia universal al objeto global, sin mportar el entorno en el que se ejecute el código. Por tanto, funcionará tanto en un navegador web como en una terminal con Node.js o Deno.

← Artículo anterior
Artículo siguiente →