Lâoggetto globale fornisce variabili e funzioni che sono accessibili in qualsiasi punto. Principalmente quelle integrate dal linguaggio o fornite dallâambiente.
In un browser lâambiente si chiama window, per Node.js viene detto global, negli altri ambienti si usano diversi termini.
Recentemente, è stato aggiunto al linguaggio globalThis, come nome standart per lâoggetto globale, il quale dovrebbe essere supportato da tutti gli ambienti. In alcuni browser, ad esempio Edge, globalThis non è ancora supportato.
Tutte le proprietà dellâoggetto globale possono essere raggiunte direttamente:
alert("Hello");
// la stessa cosa
window.alert("Hello");
In un browser le variabili globali dichiarate con var diventano proprietà dellâoggetto globale:
var gVar = 5;
alert(window.gVar); // 5 (diventa una proprietà dell'oggetto globale)
Non affidatevi a questo! Questo comportamento esiste solamente per retrocompatibilità . Gli script moderni utilizzano i moduli JavaScript, che si comportano in maniera differente. Li studieremo più avanti nel capitolo moduli JavaScript.
Inoltre, la dichiarazione di variabili in stile moderno, tramite let e const non hanno questo tipo di comportamento:
let gLet = 5;
alert(window.gLet); // undefined (non diventa una proprietà dell'oggetto globale)
If a value is so important that youâd like to make it available globally, write it directly as a property:
// rendiamo globali le informazioni dell'utente corrente, per rendere accessibili in qualsiasi punto dello script
window.currentUser = {
name: "John"
};
// in un qualsiasi altro punto del codice
alert(currentUser.name); // John
// oppure, se abbiamo una variabile locale denominata "currentUser"
// la preleviamo da window esplicitamente (più sicuro!)
alert(window.currentUser.name); // John
Detto ciò, lâutilizzo di variabili globali è da evitare. Dovrebbero esserci sempre il minor numero di variabili globali possibili. Il design del codice in cui una funzione richiede un input e ritorna un output risulta essere molto più chiaro, e molto meno propenso ad errori.
Utilizzo di polyfill
Utilizziamo lâoggetto globale per testare il supporto delle funzionalità introdotte da linguaggio.
Ad esempio, potremmo testare se lâoggetto integrato Promise esiste (nei vecchi browser non lo troverete):
if (!window.Promise) {
alert("Your browser is really old!");
}
Se non è presente (ipotizziamo di trovarci in un vecchio browser), possiamo creare un âpolyfillâ (contenitore): che consiste nellâaggiungere funzionalità moderne del linguaggio, che non sono supportate.
if (!window.Promise) {
window.Promise = ... // implementazione della caratteristica mancante
}
Riepilogo
-
Lâoggetto globale contiene le variabili che dovrebbero essere accessibili ovunque.
Incluse quelle integrate in JavaScript, come
Arraye valori specifici dellâambiente, comewindow.innerHeightâ lâaltezza della finestra nei browser. -
Lâoggetto globale ha un nome universale
globalThis.â¦Ma è più facile trovarne riferimenti alla âvecchia manieraâ, quindi con nomi specifici dellâambiente, come
window(browser) eglobal(Node.js). PoichéglobalThisè un aggiornamento recente, non è ancora supportato da Edge (ma può essere aggiunto con la tecnica polyfill). -
Dovremmo memorizzare valori nellâoggetto globale solamente se questi hanno realmente uno scopo globale.
-
In ambiente browser, senza lâutilizzo dei moduli, una variabile globale dichiarata tramite
vardiventa una proprietà dellâoggetto globale.Per rendere il codice più semplice da interpretare e aggiornare, dovremmo accedere allâoggetto globale come
window.x.
Commenti
<code>, per molte righe â includile nel tag<pre>, per più di 10 righe â utilizza una sandbox (plnkr, jsbin, codepenâ¦)