递归函数是在一个函数通过名字调用自身情况下够成的,如:
function factorial(num){
if(num <= 1){
return 1;
}else{
return num*factorial(num-1)
}
}
这是一经典的递归阶乘函数;表面这个函数是没有什么错的,但在某种情况下会出错:
var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4)
);//出错
</pre><p><span style="background-color: rgb(240, 240, 240);">解决 的办法是利用argumengts.callee,他是一个指向正在执行的函数指针,可以利用他来实现对函数的递归调用:</span></p><pre>
function factorial(num){
if(num <= 1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
不过这种方法在严格模式下,不能通过脚本访问argumengts.callee,会抛出错误;可以使用命名函数表达式来打成相同的结果:
var factorial = (function f(num){
if(num <= 1){
return 1;
}else{
return num*f(num-1);
}
});
这种方式在严格和非严格模式下都能运行!