一个常见的递归函数:
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num * factorial(num - 1);
}
}
这个函数表面看起来不会有什么问题,但是下面的代码却可能会导致它出错:
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));
这种情况可以使用arguments.callee解决:
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}
因为arguments.calee是一个指向正在执行的函数的指针,因此我们可以用它来实现对函数的递归调用。
在严格模式下不能使用arguments.callee,访问这个属性会报错。但是我们可以使用命名函数表达式来达到相同的效果:
var factorial = (function f(){
if(num <= 1) {
return 1;
} else {
return num * f(num - 1);
}
});