以经典递归阶层函数为例:
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * factorial(num-1);
}
}
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)); //出错!
首先分析为什么会出错:
在JavaScript中,函数名实际上是一个指向函数对象的指针。
当我们令anotherFactorial = factorial的时候, 变量anotherFactorial 同样指向这个递归函数。
当我们令factorial = null 的时候,函数名factorial 不再指向这个递归函数。
所以,在运行语句: return num * factorial(num-1);的时候会出错,因为此时factorial已经不再指向这个函数了。
解决方法:
(1)用arguments.callee
arguments.callee 是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用。上面的函数可以改为:
function factorial(num){
if (num <= 1){
return 1;
} else {
return num * arguments.callee(num-1);
}
}
(2)可 以使用命名函数表达式来达成相同的结果。
var factorial = (function f(num){
if (num <= 1){
return 1;
} else {
return num * f(num-1);
}
});