"Non inserire mai variabili in ambito globale" è una best practice perché rende le variabili fragili. Una tipica pagina web o in particolare una tipica applicazione web è probabile che contenga molti script diversi da più fonti, e con la stessa attenzione con cui si possono tracciare le proprie variabili globali, tutti coloro a cui si fa riferimento con gli script potrebbero non giocare.
Pensalo come un vaccino. Se tutti avessero un vaccino, non ci sarebbero minacce e se tu solo avessi un vaccino non ci sarebbe nessuna minaccia, ma nel frattempo tutti gli altri stanno cercando di farsi vaccinare, quindi potresti probabilmente farla franca senza essere vaccinati perché nessun altro è tuo minaccia, ma questo non funziona esattamente con l'ecosistema di scripting in cui stai lavorando.
C'è una certa latitudine nell'usare i globali se si usa lo spazio dei nomi. La radice del tuo spazio dei nomi è globale, ma ti è consentita solo la variabile radice dello spazio dei nomi. Questo è un compromesso che di solito la comunità di Javascript va bene, in particolare se è limitata alla tua applicazione.
Uno spazio dei nomi potrebbe essere simile a questo:
window.MyNamespace = {
ClassA: function() { },
NestedNamespace1: {
ClassB: function() { }
}
};
Questo pone ClassA e ClassB nell'annidamento dello spazio dei nomi MyNamespace:
(function() {
var myClassAInstance = new MyNamespace.ClassA();
var myClassBInstance = new MyNamesapce.NestedNamespace1.ClassB();
})();
Puoi anche crearlo usando funzioni di namespace come quella che ho creato [ qui ], che spiega anche come puoi sfruttare la semplicità del namespace.
In generale, tuttavia, la raccomandazione è di usare le variabili di chiusura ovunque. Gli spazi dei nomi sono minimi, ma scoraggiati a causa dei vantaggi delle variabili di chiusura. Una variabile di chiusura è una variabile dichiarata nell'esecuzione di una funzione. Tutti i file di script che scrivi devono essere contenuti in una funzione.
(function() { // IIFE (immediately-invoked function expression)
var myClosureVariable = 3;
$('#myDomElement').on('click', function() {
console.log(myClosureVariable); // outputs 3
});
})();
console.log(myClosureVariable); // outputs undefined