JavaScript中的递归

本文探讨了在JavaScript中实现递归函数时遇到的函数名耦合问题,并提出了使用arguments.callee及函数表达式结合函数声明的方式实现解耦,确保函数调用不受函数名变化的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归函数是在一个函数通过名字调用自身的情况下构成的,在简析JavaScript中的Function类型(四)——函数的内部属性中曾拿来举过例子:

//阶乘函数
function factorial(num){
  if(num <= 1){
    return 1;
  }else{
    return num * factorial(num - 1);
  }
}
console.log(factorial(4));//24

这种写法在函数有名字,而且名字以后也不会变的情况下是没有问题的。但是函数的执行与函数名factorial紧紧耦合在了一起,当函数名发生变化时,调用就出现了问题:

var trueFactorial = factorial;
factorial = null;
console.log(trueFactorial(4));//Uncaught TypeError: factorial is not a function

使用arguments.callee可以达到解耦的目的:

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

var trueFactorial = factorial;
factorial = null;
console.log(trueFactorial(4));// 24

如代码所示,无论将来函数名如何变化,始终都能保证正确的执行结果。

其中还说到,在严格模式下JavaScript是不支持arguments的,那么此时要实现一个松散耦合的递归函数该怎么实现呢?也很简单,可以结合使用函数表达式与函数声明的方式来定义递归函数:

var factorial = function f(num){
  if(num <= 1){
    return num;
  }else{
    return num * f(num - 1);
  }
}

console.log(factorial(5));// 120
console.log(f(5));// Uncaught ReferenceError: f is not defined

这样声明的函数,函数名是f但是在作用域中存在的引用为factorial,在f的内部可以访问到f,利用这个特点就做到了函数的调用与函数名的完全解耦合,无论将来调用方式如何变化,都不会影响执行结果:

var trueFactorial = factorial;
factorial = null;
console.log(trueFactorial(4));// 24

转载于:https://my.oschina.net/bob1900/blog/3036578

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值