递归函数是在一个函数通过名字调用自身的情况下构成的。
1 function factorail(num) 2 { 3 if(num <= 1) 4 { 5 return 1; 6 } 7 else{ 8 return num * factorail(num-1); 9 } 10 }
上面的代码虽然经典,在全局函数变量作为其引用的情况下,很容易出错。
var anotherFactorial = factorail;
factorial = null;
alert(anotherFactorail(4));
上面问题可以通过 arguments.callee 来解决。
因此最开始的递归函数可以改写成,
1 function factorail(num) 2 { 3 if(num <= 1) 4 { 5 return 1; 6 } 7 else{ 8 return num * arguments.callee(num-1); 9 } 10 }
其中,arguments.callee 是一个指向正在执行的函数的指针。
然而在严格模式下,上述代码仍然会导致错误,此时的解决方案是,通过函数表达式来达到相同的结果。
1 var factorial = (function f(num) 2 { 3 if(num <= 1) 4 { 5 return 1; 6 } 7 else 8 { 9 return num * f(num -1); 10 } 11 })
上面创建的是一个名为f() 的命名函数表达式