21. 递归函数
递归函数是在一个函数通过名字调用自身的情况下构成的。
例如:
<xmp>
function factorial(num){
if(num <= 1){
return 1;
} else {
return num * factorial(num-1)
}
}
</xmp>
这是一个经典的递归阶乘函数。虽然这个函数表面看没什么问题,但以下操作会报错
<xmp>
var fn = factorial;
factorial = null;
fn(4); //出错
</xmp>
代码解析:先把factorial函数保存在变量 fn中,然后将factorial设置为null,结果指向原始函数的引用只剩下一个。再调用fn时,必须执行factorial,而factorial不再是函数,而是null,所以会报错。
在这种情况下使用 arguments.callee可以解决这个问题,arguments.callee是一个指向正在执行的函数的指针,因此可以用它来实现函数的递归:
<xmp>
function factorial(num){
if(num <= 1){
return 1;
} else {
return num * arguments.callee(num-1)
}
}
</xmp>
但在严格模式下,不能通过脚本访问arguments.callee, 会导致报错。此时可以使用命名函数表达式达成相同的结果:
<xmp>
var factorial = function(function f(num){
if(num <= 1){
return 1;
} else {
return num * f(num-1)
}
});
</xmp>
评论
共0 条评论