JavaScript递归实现的三种方式及严格模式下的差异

作者:木棉

时间:2026-10-22

浏览:365

本文详解JavaScript中实现递归的三种方式:直接通过函数名调用、使用arguments.callee以及命名函数表达式。重点分析了在将外部引用置空后,前两种方法可能导致的错误,并指出arguments.callee在严格模式下不可用。推荐使用命名函数表达式,它在严格和非严格模式下均能安全实现递归,避免因引用丢失导致的调用失败。

文章目录

递归函数基本概念

递归函数是指通过名称调用自身来构成的函数。

基于函数名的递归实现

下面介绍如何使用递归来实现阶乘函数。

第一种方法:直接利用函数自身的名称进行调用。


 function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  console.log(factorial(4));

执行结果输出为:24;

然而,这种基于函数名的递归实现方式存在潜在问题,具体见以下代码示例:


function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  console.log(anthorFactorial(4));

此时结果仍为:24;

接着进行如下操作:


function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*factorial(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

结果变为:报错

产生该错误的原因在于:

函数名实际上是一个指向函数的指针。当我们定义另一个变量anotherFactorial并指向同一个函数时,调用anotherFactorial(4)可以正常输出24。

一旦将factorial设置为null,指向该函数的引用只剩下anotherFactorial。此时若再次调用anotherFactorial(4),由于内部递归仍尝试调用已为null的factorial,便会抛出错误信息。

基于arguments.callee的递归实现

为解决此问题,可以在函数定义内部使用arguments.callee来替代具体的函数名。

第二种方法:利用arguments.callee属性。


function factorial(num){
    if(num<=1){
      return 1;
    }else{
      return num*arguments.callee(num-1);
    }
  }
  var anthorFactorial=factorial;
  factorial=null;
  console.log(anthorFactorial(4));

执行结果为:24

arguments.callee是一个指向当前正在执行函数的指针,因此可以利用它来实现递归调用。通过用arguments.callee替换函数名,可以确保无论外部如何修改函数引用,递归调用都不会出错。因此,在编写递归函数时,使用arguments.callee比直接使用函数名更为稳妥。\n\n需要注意的是,在严格模式下,脚本无法访问arguments.callee属性,访问该属性会直接报错。不过,可以通过命名函数表达式来实现相同的效果。

基于命名函数表达式的递归实现

第三种方法:采用命名函数表达式。


 var factorial=function f(num){
    if(num<=1){
      return 1;
    }else{
      return num*f(num-1);
    }
  };
  f=null;
  console.log(factorial(4));

这种写法在严格模式和非严格模式下均能正常工作。

总结

以上介绍了JavaScript中实现递归的几种方法及其区别,希望能为读者提供帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章