JavaScript阶乘

时间:2014-08-15 20:23:22

标签: javascript factorial

不能围绕 arguments.callee ,以及为什么truefactorial = 120.一些帮助将非常感激

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

    var trueFactorial = factorial;

    factorial = function(){
        return 0;
    };

    alert(trueFactorial(5));   //120

2 个答案:

答案 0 :(得分:6)

在函数内部,arguments.callee引用该函数。

所以factorial是递归的 - 它调用自己。无论你使用什么名字。

重新定义名称factorial以引用不同的函数对第一个定义没有影响,因为在第一个定义中没有使用名称factorial

答案 1 :(得分:0)

正如评论arguments.callee is deprecated中所述,您不应该使用它(如果您的代码以严格模式运行,它甚至无法工作)。但是,如果您在示例中将arguments.callee替换为factorial,则最终结果将无效:

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

var trueFactorial = factorial;

factorial = function(){
    return 0;
};

alert(trueFactorial(5));   // 0

这是因为factorial在调用函数之前被重新分配,并且当它最终尝试在函数内部调用factorial()时,新的factorial()只会产生0。

有一种解决方法,那就是使用命名函数表达式:

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

var trueFactorial = factorial;

factorial = function(){
    return 0;
};

alert(trueFactorial(5));   // 120  (Yay!)

如果这样做,即使factorial变量在函数外部重新分配,它也会在函数内部保留其原始含义,并且不会中断。