If your goal is recursion, you don't need the function name as a string if you can get a reference to the function itself. Note that you'll still have to check and change every instance where the function is called by others, and that's likely to be a larger task than updating the recursive calls (if for no other reason than it's not localized to the function body).
Passing the function as an argument
function foo(self, i)
{
if (i === 0 )
return;
console.log(i--);
self(self, i);
}
foo(foo, 3);
Using arguments.callee (As Raynos points out, this is brittle in strict mode)
function foo(i)
{
if (i === 0 )
return;
console.log(i--);
arguments.callee(i);
}
foo(3);
Output of either option
3
2
1