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...