递归函数是在一个函数通过名字调用自身的情况下构成的,如下:
function factorial(num){
if (num <= 1){
return 1;
}
else {
return num * factorial(num-1);
}
}
这是一个经典的递归阶乘函数。虽然这个函数表面看来没什么问题,但下面的代码却可能导致它出错。
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //出错!
因为需要调用factorial时已经为null,此时使用 arguments.callee 可以解决这个问题
function factorial(num){
if(num<=1) return 1
else return arguments.callee(num-1)
}
但在严格模式下,不能通过脚本访问 arguments.callee,访问这个属性会导致错误。不过,可以使用命名函数表达式来达成相同的结果。例如:
var factorial = (function f(num){
if (num <= 1){
return 1;
}
else {
return num * f(num-1);
}
});
在严格模式或者非严格模式都能实现