El objeto global proporciona variables y funciones que están disponibles en cualquier lugar. Por defecto, aquellos que están integrados en el lenguaje o el entorno.
En un navegador se llama window
, para Node.js es global
, para otros entornos puede tener otro nombre.
Recientemente, se agregó globalThis
al lenguaje, como un nombre estandarizado para un objeto global, que debería ser compatible en todos los entornos. Es compatible con todos los principales navegadores.
Usaremos window
aquí, asumiendo que nuestro entorno es un navegador. Si su secuencia de comandos puede ejecutarse en otros entornos, es mejor usar globalThis
en su lugar.
Se puede acceder directamente a todas las propiedades del objeto global:
alerta("Hola"); // es lo mismo que ventana.alert("Hola");
En un navegador, las funciones y variables globales declaradas con var
(¡no let/const
!) se convierten en propiedad del objeto global:
vargVar = 5; alerta(ventana.gVar); // 5 (se convirtió en propiedad del objeto global)
Las declaraciones de funciones tienen el mismo efecto (declaraciones con palabra clave function
en el flujo de código principal, no expresiones de función).
¡Por favor no confíes en eso! Este comportamiento existe por motivos de compatibilidad. Los scripts modernos utilizan módulos JavaScript donde tal cosa no sucede.
Si usáramos let
en su lugar, tal cosa no sucedería:
sea gLet = 5; alerta(ventana.gLet); // indefinido (no se convierte en propiedad del objeto global)
Si un valor es tan importante que desea que esté disponible globalmente, escríbalo directamente como una propiedad:
// hacer que la información actual del usuario sea global, para permitir que todos los scripts accedan a ella ventana.currentUser = { nombre: "Juan" }; // en otro lugar del código alerta(usuario.actual.nombre); // John // o, si tenemos una variable local con el nombre "currentUser" // lo obtenemos de la ventana explícitamente (¡seguro!) alerta(ventana.actualUsuario.nombre); // John
Dicho esto, generalmente no se recomienda el uso de variables globales. Debería haber la menor cantidad de variables globales posible. El diseño de código en el que una función obtiene variables de "entrada" y produce cierto "resultado" es más claro, menos propenso a errores y más fácil de probar que si utiliza variables externas o globales.
Usamos el objeto global para probar la compatibilidad con las funciones del lenguaje moderno.
Por ejemplo, pruebe si existe un objeto Promise
integrado (no existe en navegadores muy antiguos):
si (! ventana.Promesa) { alert("¡Tu navegador es muy antiguo!"); }
Si no hay ninguno (por ejemplo, estamos en un navegador antiguo), podemos crear "polyfills": agregar funciones que no son compatibles con el entorno, pero que existen en el estándar moderno.
si (! ventana.Promesa) { window.Promise = ... // implementación personalizada de la característica del lenguaje moderno }
El objeto global contiene variables que deberían estar disponibles en todas partes.
Eso incluye funciones integradas de JavaScript, como Array
y valores específicos del entorno, como window.innerHeight
, la altura de la ventana en el navegador.
El objeto global tiene un nombre universal globalThis
.
…Pero más a menudo se hace referencia a él con nombres específicos del entorno de la “vieja escuela”, como window
(navegador) y global
(Node.js).
Deberíamos almacenar valores en el objeto global sólo si son verdaderamente globales para nuestro proyecto. Y mantenga su número al mínimo.
En el navegador, a menos que estemos usando módulos, las funciones y variables globales declaradas con var
se convierten en una propiedad del objeto global.
Para que nuestro código esté preparado para el futuro y sea más fácil de entender, debemos acceder a las propiedades del objeto global directamente, como window.x
.