javascript中递归函数需要注意的几个问题。

各位童鞋大家好!这是我开通博客后写的第二篇文章,第一篇文章纯属废话,各位看官无视即可。这第二篇该写点正经的啦,不然有点对不起各位了。

不说废话了,咱们开门见山。首先什么是递归函数捏?
答:递归函数就是一个函数通过函数名调用自身的函数。

上代码:

function apple(num){
if(num <= 1){
return 1
}else{
return num*apple(num - 1)
}
}

这是一个典型的递归函数,虽然这个函数看起来逻辑清晰,意思明白,但存在潜在的问题哦。
var banana = apple
apple = null
alert(banana(3)); //报错

上面的代码把递归函数apple保存在banana变量中,然后把原函数apple赋值为null,接下来调用banana时,必须执行apple,而apple此时已经不是函数了,所以会报错。那么如何解决这个问题呢?

我们知道,arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用。

于是上面的代码可以写成:

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

可是,可是,上面的代码在严格模式下依然会有问题,因为在严格模式下不能通过脚本访问arguments.callee,访问这个属性是会导致错误哒!!!那怎么办嘞?

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

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

这样写,递归函数在严格模式下和非严格模式下就都行得通啦。

今天就写到这里了,谢谢观赏!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值