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