15 febbraio 2021

Oggetto globale

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 Array e valori specifici dell’ambiente, come window.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) e global (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 var diventa una proprietà dell’oggetto globale.

    Per rendere il codice più semplice da interpretare e aggiornare, dovremmo accedere all’oggetto globale come window.x.

Mappa del tutorial

Commenti

leggi questo prima di lasciare un commento…
  • Per qualsiasi suggerimento - per favore, apri una issue su GitHub o una pull request, piuttosto di lasciare un commento.
  • Se non riesci a comprendere quanto scitto nell'articolo – ti preghiamo di fornire una spiegazione chiara.
  • Per inserire delle righe di codice utilizza il tag <code>, per molte righe – includile nel tag <pre>, per più di 10 righe – utilizza una sandbox (plnkr, jsbin, codepen…)