递归

在讲解递归之前,我们先来看一个阶乘函数

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

factorial(5) ==> 120

很显然,上面是一个 54321 的计算函数,不过,大家有没有发现上面的函数有啥问题吗?

答案:这个函数将 factorial 紧紧地耦合在一起,如果改变了函数名,还需要再去函数内部改变 factorial 来确保这个递归不会出现问题,

然而,有没有解决方法呢?

有的!

在函数内部,有两个特殊的对象:arguments和this,其中,arguments主要用来保存函数参数,但是这个对象还有一个名叫callee的属性,这个属性是一个指针,指向拥有这个arguments 对象的函数。

所以,上面这个函数可以这样改造:

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

在这个重写后的 factorial()函数的函数体内,没有再引用函数名 factorial。这样,无论引用 函数时使用的是什么名字,都可以保证正常完成递归调用

你可能感兴趣的:(递归)