JavaScript: variabili globali e locali

JavaScript: variabili globali e locali

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.

Torna su