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

时间:2011-07-01 13:39:34

标签: javascript function

  

可能重复:
  Can I get the name of the currently running function in javascript?

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

(例如php有“魔术常量”,如__FUNCTION__等。 - 在JavaScript中有类似之处吗?)

4 个答案:

答案 0 :(得分:3)

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

将函数作为参数传递

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

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

foo(foo, 3);

使用arguments.callee (正如Raynos指出的那样,在严格模式下这很脆弱)

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

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

foo(3);

输出任一选项

3
2
1

答案 1 :(得分:1)

也许你可以重构你的功能,因为arguments.callee不可靠。例如,您可以使用执行递归的嵌套函数:

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);
};

[ UPDATE ]实际上,无论父作用域如何,您都应该能够通过其名称访问该函数。在我的测试中,以下示例有效:

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'

答案 2 :(得分:0)

function senad()
{
  var fName= arguments.callee.toString();
            fName= fName.substr('function '.length);       
            fName= fName.substr(0, fName.indexOf('('));  
            alert(fName)
}
senad();

答案 3 :(得分:0)

(function() { 
  "use strict"; 
  console.log(arguments.callee); 
})()

产量

TypeError: Cannot access property 'callee' of strict mode arguments

你不能在ES5严格模式下这样做,并且有充分的理由。这是一个黑客。不要这样做。