arguments主要的用途是保存参数,它有个属性cell的属性,该属性是一个指针,指向拥有arguments的对象的函数。函数
通常状况下,使用递归时直接调用函数的名称,实现递归其实现的调用自身函数。
例子以下:阶乘spa
function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num - 1); } } var fn = factorial; factorial = function(){return 0;} alert(fn(5));//结果是0 alert(factorial(5));//结果0
为何要使用arguments.callee代替函数名,为了解除这种执行函数与函数名factorial耦合在一块儿,指针
因此使用了arguments.callee,不管在后期引用函数时使用什么名字,均可以保证完成递归。code
function factorial(num){ if(num <= 1){ return 1; }else{ return num * arguments.callee(num - 1); } } var fn =factorial; factorial = function(){return 0;} alert(fn(5));//120 alert(factorial(5));//0