javascript-globalthis-window-global

El objeto globalThis, window y global en JavaScript

En JavaScript, este contexto de ejecución tiene un objeto especial llamado objeto global. El objeto global es la raíz de todo el programa

El objeto global varía dependiendo del entorno en el que se ejecuta

  • En navegadores, el objeto global es window.
  • En entornos de servidor como Node.js, el objeto global es global.

El objeto global es el contenedor principal de todas las variables, funciones y objetos que se definen en un programa.

Además, actua como punto de acceso común a las funciones y objetos predefinidos por el entorno, como console, setTimeout, y otros.

Posteriormente se introdujo la pabra reservada globalThis, para proporcionar una forma uniforme de referirnos al objeto global, independientemente del entorno.

En el navegador window

En los navegadores web, el objeto global es window. Es un objeto especial que:

  • Representa la ventana del navegador o pestaña donde se ejecuta el script.
  • Contiene métodos, propiedades y objetos relacionados con el navegador y el documento (por ejemplo, alert, document, etc.).

Veamos un ejemplo:

console.log(window); // Muestra el objeto window completo
console.log(window.alert); // Función alert
console.log(window.document); // El DOM del documento actual

También podemos añadir nuestras propias variables al objeto window, lo cuál hará que estén accesibles en cualquier parte del programa.

window.miVariableGlobal = "Hola, mundo"; // ¡No recomendado!
console.log(window.miVariableGlobal); // "Hola, mundo"

En general, casi siempre es una mala práctica hacer esto.

En entornos como Node.js global

En runtimes como Node.js, accedemos al objeto global con la palabra reservada global

console.log(global); // Muestra el objeto global en Node.js

Podemos definir propiedades globales en este objeto, pero nuevamente, no es una práctica recomendada.

global.miPropiedad = "Valor global";
console.log(global.miPropiedad); // "Valor global"

La solución estándard globalThis

En entornos modernos, ECMAScript introduce globalThis como una manera unificada de acceder al objeto global.

Este es independientemente de si estamos en un navegador, Node.js, o cualquier otro entorno. Es decir,

  • En navegadores, globalThis es equivalente a window.
  • En Node.js, globalThis es equivalente a global.
globalThis.miGlobal = "Disponible en todos los entornos";
console.log(globalThis.miGlobal); // "Disponible en todos los entornos"

Esto nos permite escribir código portable (que funciona tanto en navegadores como en servidores) sin preocuparnos por el contexto.

Compatibilidad de globalThis

Aunque globalThis es un estándar moderno, no está disponible en entornos antiguos. En estos casos, podemos usar un polyfill para emular su comportamiento:

const getGlobal = () => {
    if (typeof globalThis !== "undefined") return globalThis;
    if (typeof window !== "undefined") return window;
    if (typeof global !== "undefined") return global;
    throw new Error("No se pudo determinar el objeto global");
};

const globalObj = getGlobal();
console.log(globalObj);

Aunque es tentador usar el objeto global para almacenar datos, es no es una práctica segura ni aconsejada (de hecho, es bastante guarro)

Sin embargo, en ocasiones es útil, o incluso no nos queda otra. Siempre intentando evitarlo siempre, a veces os puede sacar de un apuro.