Ah ... le forme funzionali di ricorsione .... [[[flashback alla classe comp sci]]]
Si potrebbe utilizzare una funzione di supporto:
function X(f) { return f.apply(this, arguments); }
X(function(me, n) { return n<=1 ? n : n*me(me,n-1); }, 6);
(che restituisce 720; questa è la funzione fattoriale, l'esempio canonico di ricorsione)
Ciò può a sua volta essere anonimi:
(function (f) { return f.apply(this, arguments); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
o specializzato per funzioni di un argomento, evitare apply
e arguments
:
(function (f,x) { return f(f,x); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
(entrambi restituiscono anche 720)
Questo trucco dell'utilizzo di una funzione di supporto consente alla funzione di ricevere il suo elfo come primo argomento, e quindi si chiama.
Per adattare il tuo esempio:
(function (f,x) { return f(f,x); })(
function(me, i) { console.log(i); if (i<5) me(me,i+1); },
0)
che funziona come previsto in Firebug (ceppi 0,1,2,3,4,5 per console)
La cosa migliore da fare è non avere una funzione anonima, ma una funzione definita con una dichiarazione di funzione. – Pointy