Javascript中递归的调用

  递归函数就是调用自身,如下所示:

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  }