Arrow Functions in Javascript 1.7

Annuntio vobis gaudium magnum, da Firefox 22 è possibile usare le Arrow Functions.

Le Arrow Functions (italiano: funzioni a freccia) sono tanto orribili a vedersi quanto utili. Esse ci risparmiano odiose dichiarazioni di variabili `self` o `me` o `oldThis` e chi più ne ha più ne metta.

Ma andiamo con ordine.

Una cosa del genere per esempio:

a=>a*a 

equivale alla vecchia

function(a) { 
	return a*a 
} 

Con la piccola differenza che il context della funzione al momento della sua chiamata è lo stesso di quello presente durante la sua dichiarazione.

Nell'esempio di prima non cambia niente perché non usiamo il riferimento al contesto di esecuzione (ovvero la parola chiave `this`).

 

Ma prendiamo un esempio di questo tipo: 

window.onload = function() { 
	document.getElementsByTagName('body')[0].addEventListener('click', function() { 
		console.log(this); // Body Element 
	}); 

	document.getElementsByTagName('body')[0].addEventListener('click', () => { 
		console.log(this); // Object Window 
	}); 
} 

mostra chiaramente la differenza. Il context (o se preferite il valore di `this`) cambia nel primo (da window a body) ma non nel secondo. 

E' osceno a vedersi perché non ha nulla a che fare con la sintassi di Javascript old style, inoltre la sintassi non è rigida (la parola `return` per esempio può essere omessa). Ma almeno ha un suo scopo. 

Per fare la stessa cosa con la sintassi precedente, si è soliti creare una variabile generalmente chiamata `self` da richiamare al posto di `this`. 

window.onload = function() { 
	var self = this; 
	document.getElementsByTagName('body')[0].addEventListener('click', function() { 
		console.log(self); // Window Element 
	}); 
} 

Non è poi la fine del mondo... ammesso che non si abbiano decine di callback annidate tra loro e decine di variabili `self`, `me`, `oldThis`. 

I più furbi, tuttavia, anziché utilizzare nomi vaghi, utilizzano nomi coerenti col contesto. Se il `self` si riferisce all'oggetto `body` lo si chiama `oBody`. Almeno non si perde il filo...