经典的阶乘函数
function factorial(){
if(num <= 1){
return 1;
}else{
return num * factorial(num - 1);
}
}
这个阶乘函数用到了递归算法,在函数有名字,并且名字不会发生变化的情况下,这样的定义是没有问题的。但问题是这个函数的执行与函数名factorial紧紧耦合在了一起。在把阶乘函数赋值给另一个名字时,很容易出现无法完成递归调用的情况。
在函数内部,有其中一个特殊的对象arguments。arguments的主要用途是保存函数参数,但是它有一个callee的属性对递归调用很有用处。callee属性是一个指针,指向当前的拥有arguments对象的函数。所以我们的阶乘函数可以重写为这样:
function factorial(){
if(num <= 1){
return 1;
}else{
return num * arguments.callee(num - 1);
}
}
这个重写后的factorial()函数的函数体内,没有再引用函数名factorial。这样子做,无论引用函数时使用的是什么名字,都可以保证了正常完成递归调用。 实现:
var trueFactorial = factorial;
alert (trueFactorial(5)); //120