在javascript函数内部,有2个特殊的对象:arguments和this。其中,arguments是一个类数组对象,它包含了传入函数中的所有参数。虽然arguments对象主要用于保存函数参数,但它还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。请看下面这个非常经典的阶乘函数。
-------------------------------------------
function factorail(n){
if(n<=1){
return 1;
}else{
return n*factorail(n-1);
}
}
-------------------------------------------
定义阶乘一般要用到递归算法,如上代码所示,如果函数有名字,而且名字不改变得情况下,这样定义没有问题。但是,这个函数的运行与函数名factorail紧紧耦合在一起了,为了消除这种紧密耦合的现象,可以向下面这样使用arguments.callee。
-------------------------------------------
function factorail(n){
if(n<=1){
return 1;
}else{
return n*arguments.callee(n-1);
}
}
-------------------------------------------
在这个重写后的factorail()函数的函数体内,木有在引用函数名factorail,而是通过arguments.callee指向其本身。这样,无论引用函数时候使用什么函数名,都可以完成递归调用。例如:
-------------------------------------------
var trueFactorail = factorail;
factorail = function(){return 0}
alert(trueFactorail(5)); //120
alert(factorail(5)); //0
-------------------------------------------