Una delle cose piu' belle di javascript e' che le funzioni sono oggetti di prima calsse. Non c'e' alcuna differenza in javascript tra un numero, una stringa, e una funzione. Tutti questi tipi di dati possono essere passati come argomento, memorizzati in variabili, ritornati come valore di ritorno di una funzione.
Javascript ha anche una sintassi che permette di specificare le funzioni in maniera letterale. Cosi' come scrivo:
a = 5;
b = "foo";
Posso scrivere anche:
myfunc = function() { alert("ciao"); }
o anche passare la funzione direttamente come argomento:
map([1,2,3,4],function() {return x*x;});
(vedi
spaghetti ajax per sapere cosa fa la funzione
map()).
Insomma in javascript le funzioni sono oggetti, e supporta anche le funzioni anonime (quasi sempre se la prima feature e' supportata la seconda segue come conseguenza banale). Ma... e' possibile avere una funzione anonima ricorsiva, che chiama se stessa? Come fa a chiamarsi se non ha un nome?
Ogni funzione in javascript contiene un riferimento a se stessa! Dunque e' assolutamente possibile. Ecco un simpatico count-down implementatno tramite una funzione anonima ricorsiva:
x = function(x) {
if (x > 0) {
alert(x);
arguments.callee(x-1);
}
};
x(3);
Se vi state chiedendo a chi puo' servire tale diavoleria, sappiate che l'ho utilizzato in codice reale. In molti casi le funzioni anonime vengono utilizzate per gestire un evento, qualcosa come:
mybutton.onclick = function() { .... };
Avevo la necessita' di fare in modo che se la funzione che gestiva l'evento onclick non poteva svolgere subito il suo compito, si sarebbe auto-chiamata a distanza di qualche secondo. Lei stessa dunque crea un timer a cui si passa come riferimento per chiamarsi. In questo caso non si tratta di vera ricorsione, ma c'e' comunque un auto-riferimento.
Tutta questa flessibilita' sommata al fatto che javascript supporta anche le chiusure, alla OOP prototype based, ne fanno di certo uno dei linguaggi piu' belli a cui il vasto pubblico e' esposto quotidianamente.