Javascript 无论函数名如何,如何执行递归?

Javascript 无论函数名如何,如何执行递归?,javascript,function,Javascript,Function,可能重复: 我需要这个用于递归。我希望能够在不检查和更改函数调用自身的每个实例的情况下更改函数名 (例如,php有“神奇常量”,如\uuuuu函数\uuuuu等,在JavaScript中类似吗?) 屈服 TypeError:无法访问严格模式参数的属性“callee” 您不能在ES5严格模式下执行此操作,这是有充分理由的。这是一个黑客。不要这样做。如果您的目标是递归,您不需要将函数名作为字符串,如果您可以获得对函数本身的引用。请注意,您仍然需要检查和更改其他人调用函数的每个实例,这可能比更新递归

可能重复:

我需要这个用于递归。我希望能够在不检查和更改函数调用自身的每个实例的情况下更改函数名

(例如,php有“神奇常量”,如
\uuuuu函数\uuuuu
等,在JavaScript中类似吗?)

屈服

TypeError:无法访问严格模式参数的属性“callee”


您不能在ES5严格模式下执行此操作,这是有充分理由的。这是一个黑客。不要这样做。

如果您的目标是递归,您不需要将函数名作为字符串,如果您可以获得对函数本身的引用。请注意,您仍然需要检查和更改其他人调用函数的每个实例,这可能比更新递归调用(如果没有其他原因,只是它没有本地化到函数体)的任务更大

将函数作为参数传递

function foo(self, i)
{
    if (i === 0 )
        return;

    console.log(i--);
    self(self, i);
}

foo(foo, 3);
使用arguments.callee(正如Raynos指出的,在严格模式下这是脆弱的)

任一选项的输出

3
2
1

也许您可以重构函数,因为
参数。被调用方
不可靠。例如,可以使用执行递归的嵌套函数:

var name_does_not_matter = function(m) {
    var inner = function(n) {
        if (n <= 2) return 1;
        return inner(n-2) + inner(n-1);
    };
    return inner(m);
};
var name\u不重要=函数(m){
var内部=函数(n){

如果(n)这个问题已经有了答案……实际上这个问题略有不同,因为他想要的是函数的引用,而不是真正的名称。仅名称对他递归调用没有帮助……因此:没有完全重复。@Ferdinand同意。“提醒函数的名称”和“让函数本身调用而不使用其名称”是完全不同的问题。你的答案也是+1;实际上我更喜欢它而不是我自己的:)
function foo(i)
{
    if (i === 0 )
        return;

    console.log(i--);
    arguments.callee(i);
}

foo(3);
3
2
1
var name_does_not_matter = function(m) {
    var inner = function(n) {
        if (n <= 2) return 1;
        return inner(n-2) + inner(n-1);
    };
    return inner(m);
};
var foo = 10;
var bar = function foo(n) {
    return (n <= 2) ? 1 : foo(n-2) + foo(n-1);
};
alert(foo);  // Displays '10'
alert(bar(10));  // Displays '55'