不能围绕 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
答案 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
变量在函数外部重新分配,它也会在函数内部保留其原始含义,并且不会中断。