In JavaScript uno dei primi concetti da capire è la differenza tra variabili locali e globali. In generale si dovrebbe cercare di evitare le variabili globali (Stefanov, Crockford, Zakas) e usare il contesto di esecuzione (scope) delle funzioni per gestire l'accesso alle variabili. Quando si usano variabili globali si inquina il namespace globale e si possono generare conflitti fra il vostro codice e il codice di librerie o di script di terze parti. Vediamo in dettaglio queste problematiche.
Variabili globali
La variabile dell'esempio che segue è accessibile in ogni punto del vostro codice, ossia è globale:
var global = 'Test';
function doSomething() {
alert(global); // 'Test'
}
var Class = {
obj: {
method: function() {
alert(global); // 'Test'
}
}
};
alert(global); // 'Test'
Il problema nasce quando un altro script o una libreria usa lo stesso nome per una sua variabile. In questo caso la vostra variabile globale sovrascriverà la variabile dello script o della libreria.
Variabili locali
Una variabile definita all'interno di un contesto di esecuzione (scope) è accessibile solo in quel contesto:
var doSomething = function() {
var local = 'Test';
alert(local); // 'Test': è nel contesto di doSomething()
this.run = function() {
alert(local); // 'Test': è ancora nel contesto di doSomething()
};
};
alert(local); // 'undefined': è solo nel contesto di doSomething()
Variabili locali e visibilità delle proprietà di un oggetto
Il seguente oggetto:
function Class() {
var local = 'Private';
this.property = 'Public';
}
ha un membro privato non perchè JavaScript supporta le tradizionali parole chiave OOP relative alla visibilità, ma solo perchè la variabile local
non è visibile al di fuori del contesto dove è stata definita. Se vogliamo accedervi, dobbiamo creare un metodo getter pubblico:
function Class() {
var local = 'Private';
this.property = 'Public';
this.getLocal = function() {
return local;
}
}
Il nostro metodo getter può accedere alla variabile perchè entrambi condividono lo stesso contesto (Class
). Altrimenti la variabile non sarebbe accessibile.