arguments.callee是一个指向正在执行的函数的指针。在递归函数中可以如此用:
function abc(num){
if(num<=1){
return 1;
}else{
retrun num*arguments.callee(num-1); //这里arguments.callee代替了原有的函数名abc
}
}
这种用法的好处是如果出现如下情况,不会导致错误
将函数abc赋值给一个变量:
function abc(num){
if(num<=1){
return 1;
}else{
retrun num*abc(num-1);
}
}
var ABC=abc;
abc=null;
alert(ABC(4));//这里会报错。因为abc已经为null,虽然abc之前已经赋值给了ABC,但在进行内部递归调用时,仍然需要用到abc(num-1),因此会报错。
上述方法在严格模式下不能通过脚本访问,所以可以使用命名表达式来达成相同结果
var abc=(function f(num){
if(num<=1){
return 1;
}else{
return num*f(num-1);
}
})
这种方式无论将abc赋给什么变量,即便另abc=null,函数名f仍然有效。