O objeto global fornece variáveis e funções que estão disponíveis em qualquer lugar. Por padrão, aqueles que estão integrados à linguagem ou ao ambiente.
Em um navegador ele se chama window
, para Node.js é global
, para outros ambientes pode ter outro nome.
Recentemente, globalThis
foi adicionado à linguagem, como um nome padronizado para um objeto global, que deve ser suportado em todos os ambientes. É compatível com todos os principais navegadores.
Usaremos window
aqui, assumindo que nosso ambiente é um navegador. Se o seu script puder ser executado em outros ambientes, é melhor usar globalThis
.
Todas as propriedades do objeto global podem ser acessadas diretamente:
alerta("Olá"); //é o mesmo que window.alert("Olá");
Em um navegador, funções e variáveis globais declaradas com var
(não let/const
!) tornam-se propriedade do objeto global:
var gVar = 5; alerta(janela.gVar); // 5 (tornou-se uma propriedade do objeto global)
As declarações de função têm o mesmo efeito (instruções com palavra-chave function
no fluxo de código principal, não expressões de função).
Por favor, não confie nisso! Esse comportamento existe por motivos de compatibilidade. Os scripts modernos usam módulos JavaScript onde isso não acontece.
Se usássemos let
em vez disso, tal coisa não aconteceria:
seja gLet = 5; alerta(janela.gLet); // indefinido (não se torna uma propriedade do objeto global)
Se um valor for tão importante que você gostaria de disponibilizá-lo globalmente, escreva-o diretamente como uma propriedade:
// torna globais as informações atuais do usuário, para permitir que todos os scripts as acessem janela.usuárioatual = { nome: "João" }; //em algum outro lugar no código alerta(usuárioatual.nome); // John // ou, se tivermos uma variável local com o nome "currentUser" // obtém-o explicitamente da janela (seguro!) alerta(window.currentUser.name); // John
Dito isto, o uso de variáveis globais geralmente é desencorajado. Deve haver o mínimo possível de variáveis globais. O design de código onde uma função obtém variáveis de “entrada” e produz determinado “resultado” é mais claro, menos propenso a erros e mais fácil de testar do que se usasse variáveis externas ou globais.
Usamos o objeto global para testar o suporte de recursos de linguagem moderna.
Por exemplo, teste se existe um objeto Promise
integrado (isso não acontece em navegadores realmente antigos):
if (!window.Promise) { alert("Seu navegador é muito antigo!"); }
Se não houver (digamos, estamos em um navegador antigo), podemos criar “polyfills”: adicionar funções que não são suportadas pelo ambiente, mas que existem no padrão moderno.
if (!window.Promise) { window.Promise = ... // implementação personalizada do recurso de linguagem moderna }
O objeto global contém variáveis que devem estar disponíveis em qualquer lugar.
Isso inclui JavaScript integrado, como Array
e valores específicos do ambiente, como window.innerHeight
– a altura da janela no navegador.
O objeto global tem um nome universal globalThis
.
…Mas é mais frequentemente referido por nomes específicos de ambiente “antigos”, como window
(navegador) e global
(Node.js).
Devemos armazenar valores no objeto global somente se eles forem verdadeiramente globais para o nosso projeto. E mantenha o número deles no mínimo.
No navegador, a menos que estejamos usando módulos, funções globais e variáveis declaradas com var
tornam-se uma propriedade do objeto global.
Para tornar nosso código à prova de futuro e mais fácil de entender, devemos acessar as propriedades do objeto global diretamente, como window.x
.