Javascript: funzioni anonime ricorsive.

Friday, 02 March 07
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.
4466 views*
Posted at 18:13:15 | permalink | 5 comments | print
Do you like this article?
Subscribe to the RSS feed of this blog or use the newsletter service in order to receive a notification every time there is something of new to read here.

Note: you'll not see this box again if you are a usual reader.

Comments

timendum writes:
03 Mar 07, 07:23:44
senza un return la tua funzione è un po' troppo inutile....

PS i feeeeeeeeed
antirez writes:
03 Mar 07, 07:35:20
perche'? Il punto della funzione e' il suo side effect (l'alert) in quel caso. Le funzioni ricorsive per essere utili non devono necessariamente ritornare un valore, anche le piu' classiche, ad esempio quelle che attraversano un albero binario.

Per i feed... prometto di sistemarli entro qualche giorno :)
l.s. writes:
03 Mar 07, 17:07:48
Hai ragione, è uno dei migliori linguaggi "mainstream" in circolazione, è potente ed elegante e allo stesso tempo è uno dei più vituperati e sottovalutati... per molti è solo un linguaggio-giocattolo.
l.s. writes:
06 Mar 07, 05:09:48
Il 2007 potrebbe essere l'anno della rivincita per il JavaScript: "JavaScript scores all time high and surpasses C#" (http://www.tiobe.com/tpci.htm)
pp writes:
15 Mar 07, 11:49:39
No! Ed io che avevo pensato al Y combinator ;)
comments closed