Ах ... функциональные формы рекурсии .... [[[flashback to comp sci class]]]
Вы можете использовать вспомогательную функцию:
function X(f) { return f.apply(this, arguments); }
X(function(me, n) { return n<=1 ? n : n*me(me,n-1); }, 6);
(возвращает 720; это факториальная функция, канонический пример рекурсии)
Это, в свою очередь, может быть анонимизировано:
(function (f) { return f.apply(this, arguments); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
или специализировано для функций одного аргумента, чтобы избежать apply
и arguments
:
(function (f,x) { return f(f,x); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
(оба из которых также возвращают 720)
Этот прием использования вспомогательной функции позволяет вашей функции получать себя в качестве первого аргумента и, таким образом, вызыватьсам по себе.
Чтобы адаптировать ваш пример:
(function (f,x) { return f(f,x); })(
function(me, i) { console.log(i); if (i<5) me(me,i+1); },
0)
, который работает, как и ожидалось, в Firebug (протоколирует 0,1,2,3,4,5 в консоль)