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 awindow
. - En Node.js,
globalThis
es equivalente aglobal
.
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.