【问题标题】:How can I execute recursion regardless of the function name? [duplicate]无论函数名称如何,如何执行递归? [复制]
【发布时间】:2011-07-01 13:39:33
【问题描述】:

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

我需要这个进行递归。我希望能够更改函数名称,而无需检查和更改函数调用自身的每个实例。

(例如 php 有“魔术常量”,如 __FUNCTION__ 等 - 在 JavaScript 中有类似的东西吗?)

【问题讨论】:

  • 这个问题已经有了答案...See Here
  • 其实这个问题略有不同,因为他想要的是函数的引用而不是真正的名字。单独的名字并不能帮助他进行递归调用......因此:没有完全重复
  • @Ferdinand 同意。 “提醒函数的名称”和“让函数自己调用而不使用它的名称”是完全不同的问题。对您的回答也+1;我实际上更喜欢它而不是我自己的:)

标签: javascript function


【解决方案1】:

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

将函数作为参数传递

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

【讨论】:

    【解决方案2】:

    也许你可以重构你的函数,因为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'
    

    【讨论】:

      【解决方案3】:
      function senad()
      {
        var fName= arguments.callee.toString();
                  fName= fName.substr('function '.length);       
                  fName= fName.substr(0, fName.indexOf('('));  
                  alert(fName)
      }
      senad();
      

      【讨论】:

        【解决方案4】:
        (function() { 
          "use strict"; 
          console.log(arguments.callee); 
        })()
        

        产量

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-24
          • 1970-01-01
          • 2019-02-04
          • 2021-08-03
          • 2021-07-15
          • 2021-08-10
          • 2017-01-20
          相关资源
          最近更新 更多