21. 递归函数

递归函数是在一个函数通过名字调用自身的情况下构成的。

例如:

<xmp>
function factorial(num){
    if(num <= 1){
        return 1;
    } else {
        return num * factorial(num-1)
    } 
}
</xmp>

这是一个经典的递归阶乘函数。虽然这个函数表面看没什么问题,但以下操作会报错

<xmp>
 var fn = factorial;
 factorial = null;
 fn(4);   //出错
</xmp>

代码解析:先把factorial函数保存在变量 fn中,然后将factorial设置为null,结果指向原始函数的引用只剩下一个。再调用fn时,必须执行factorial,而factorial不再是函数,而是null,所以会报错。

在这种情况下使用 arguments.callee可以解决这个问题,arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现函数的递归:

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

但在严格模式下,不能通过脚本访问arguments.callee, 会导致报错。此时可以使用命名函数表达式达成相同的结果:

<xmp>
var factorial = function(function f(num){
  if(num <= 1){
        return 1;
    } else {
        return num * f(num-1)
    } 
});
</xmp>
评论

0 条评论