各位童鞋大家好!这是我开通博客后写的第二篇文章,第一篇文章纯属废话,各位看官无视即可。这第二篇该写点正经的啦,不然有点对不起各位了。
不说废话了,咱们开门见山。首先什么是递归函数捏?
答:递归函数就是一个函数通过函数名调用自身的函数。
上代码:
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)
}
});
这样写,递归函数在严格模式下和非严格模式下就都行得通啦。
今天就写到这里了,谢谢观赏!