递归函数就是调用自身,如下所示:
1 function factorial(num){ 2 if(num<=1){ 3 return 1; 4 }else{ 5 return num*factorial(num-1); 6 } 7 }
这是经典的递归调用,但是执行如下代码时会导致出错。
1 var anotherFactorial=factorial; 2 factorial=null; 3 alert(anotherFactorial(3)); //Uncaught TypeError: factorial is not a function
上面的代码先把factorial()函数保存在anotherFactorial中,然后将factorial设置为null。结果指向原始函数的指针只剩下一个,在接下来的调用就会出现错误(factorial已经不是函数),此时使用arguments.callee(即指向正在执行函数的指针)可以解决这个问题,即:
1 function factorial(num){ 2 if(num<=1){ 3 return 1; 4 }else{ 5 return num*aguments.callee(num-1); 6 } 7 }
但是在严格模式下,不能通过脚本访问aguments.callee。最好的解决方法是使用命名函数表达式,如下:
1 var factorial=(function f(num){ 2 if(num<=1){ 3 return 1; 4 }else{ 5 return num*f(num-1); 6 } 7 }