第七章 函数表达式(1.递归)

  ·   JS高设(第三版)   ·   JavaScript     浏览量:

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

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

这是一个经典的递归阶乘函数.看起来没什么问题,但是下面的代码却可能导致他出错

var anotherFactorial = factorial();
factorial = null;
alert(anotherFactorial(4)); //出错!

在调用anotherFactorial的时候,factorial内部的factorial已经为空了,所以会报错
可以使用arguments.callee解决这个问题,arguments.calee是一个指向正在执行的函数的指针,因此可以用它来实现对函数递归的调用

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

但是在严格模式下不能使用callee,会报错
不过,可以使用命名函数表达式来达成相同结果.

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

以上代码创建了一个名为f()的命名函数,然后将它赋值给变量factorial。即使把函数赋值给了另一个变量,函数f仍然有效,所以递归调用照样能够完成。严格模式也不会出问题



收起 >>
第七章 函数表达式(1.递归)