当前位置: 首页 > 面试题库 >

递归调用javascript函数

井兴怀
2023-03-14
问题内容

我可以在变量中创建一个递归函数,如下所示:

/* Count down to 0 recursively.
 */
var functionHolder = function (counter) {
    output(counter);
    if (counter > 0) {
        functionHolder(counter-1);
    }
}

这样,functionHolder(3);将输出3 2 1 0。假设我做了以下事情:

var copyFunction = functionHolder;

copyFunction(3);将输出3 2 1 0如上。如果我再更改functionHolder如下:

functionHolder = function(whatever) {
    output("Stop counting!");

然后functionHolder(3);将给出Stop counting!,如预期的那样。

copyFunction(3);现在给出3 Stop counting!它所指的functionHolder,而不是函数(它本身指向的)。在某些情况下这可能是理想的,但是有没有一种方法可以编写函数以便它调用自身而不是保存它的变量?

也就是说,是否可以 更改线路,functionHolder(counter-1);以便3 2 1
0在调用时仍能完成所有这些步骤copyFunction(3);?我试过了,this(counter-1);但这给了我错误this is not a function


问题答案:

使用命名函数表达式:

您可以为函数表达式指定一个实际上是 私有 的名称,并且只有在函数内部才能看到:

var factorial = function myself (n) {
    if (n <= 1) {
        return 1;
    }
    return n * myself(n-1);
}
typeof myself === 'undefined'

下面myself该函数的可见里面只有 自己。

您可以使用此私有名称来递归调用该函数。

请参阅[13. FunctionDefinitionECMAScript 5规范:

可以从FunctionExpression的FunctionBody内部引用FunctionExpression中的标识符,以允许该函数以递归方式调用自身。但是,与FunctionDeclaration中的功能不同,FunctionExpression中的Identifier不能从中引用,也不会影响包围FunctionExpression的范围。

请注意,版本8之前的InternetExplorer的行为不正确,因为该名称实际上在封闭的变量环境中可见,并且它引用了实际功能的副本(请参见下面的_patrick dw_ 的注释)。

使用arguments.callee:

或者,您可以arguments.callee用来引用当前函数

var factorial = function (n) {
    if (n <= 1) {
        return 1;
    }
    return n * arguments.callee(n-1);
}

ECMAScript的第五版禁止在严格模式下使用arguments.callee(),但是:

(来自MDN):在常规代码中arguments.callee指的是封闭函数。这种用例很弱:只需命名封闭函数即可!此外,arguments.callee实质上阻碍了诸如内联函数之类的优化,因为如果访问arguments.callee,必须使其能够提供对未内联函数的引用。严格模式功能的arguments.callee是不可删除的属性,在设置或检索时会抛出该属性。



 类似资料:
  • 本文向大家介绍JavaScript中匿名函数的递归调用,包括了JavaScript中匿名函数的递归调用的使用技巧和注意事项,需要的朋友参考一下 不管是什么编程语言,相信稍微写过几行代码的同学,对递归都不会陌生。 以一个简单的阶乘计算为例: 我们可以看出,递归就是在函数内部调用对自身的调用。 那么问题来了,我们知道在Javascript中,有一类函数叫做匿名函数,没有名称,怎么调用呢?当然你可以说,

  • 本文向大家介绍详解Javascript函数声明与递归调用,包括了详解Javascript函数声明与递归调用的使用技巧和注意事项,需要的朋友参考一下 Javascript的函数的声明方式和调用方式已经是令人厌倦的老生常谈了,但有些东西就是这样的,你来说一遍然后我再说一遍。每次看到书上或博客里写的Javascript函数有四种调用方式,我就会想起孔乙己:茴字有四种写法,你造吗? 尽管缺陷有一堆,但Ja

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后

  • 第二个构造函数应该调用第一个构造函数,但却给了我“递归构造函数调用”错误。 我明白这个错误的意思,只是不明白递归在哪里。第一个contructor将作为参数,而应该是该类型的数组。我错过了什么? 多谢了。

  • 这个递归编码是错误的还是仅仅是那个控制台。即使执行递归,log()也不总是被执行? 在控制台中执行testrecursion不会返回任何错误。 信息控制台日志显示 再次执行测试递归会在信息控制台日志中显示这一点。 第三次执行testrecursion会在信息控制台日志中显示这一点。 在对此进行了数十次测试后,递归步骤似乎偶尔被调用。输出似乎是随机的。预期输出为 这是否看起来像递归正确发生,只是控制

  • 需求:生成一个集合的所有可能组合的算法,没有重复项,或者递归调用函数返回结果。 在JavaScript中排列提供的大部分答案,如果不是全部的话?从循环或其他函数中递归调用函数以返回结果。 循环内递归函数调用示例 在为一个集合确定了各个置换的总数之后,可以使用、和创建并填充包含所有六个置换的结果数组 在计算排列和工作面试问题时,试图根据图中显示的模式再现有序词典排列算法的结果,该算法是基于C++实用