JS经典递归及其易错点

先看下代码:

function factorial(num){
	if(num<=1){
		return 1;
	}else{
		return num*factorial(num-1);
	}
}
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));

一看这是一段很典型的递归阶乘函数

不过细心一看不难发现,这段code有一个很大的bug

执行的时候将会将会报错

原因就在于 factorial=null 这一句,可别忘了

我们在factorial 递归时引用了自身的

当我们将factorial复制给 anotherFactorial 时,这并没什么问题

问题就在factorial=null,由于递归体调用了自身,故清除原函数无非是“自杀行为”


还好JS提供了处理类似问题的方法:argument.callee

该方法是一个指向正在执行的函数的指针,因此可以用她来实现对函数的递归调用

修正后的code

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


但是在严格模式下,上面那段修正后的code又有问题了

因为在严格模式下 不能通过脚本访问argument.call ,访问这个属性会导致错误。

 解决这个问题可以用命名函数表达式

function factorial=(function f(num){
	if(num<=1){
		return 1;
	}else{
		return num*f(num-1);
	}
}):
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值