您的位置:首页 > 其它

递归

2019-03-13 18:24 92 查看

递归函数是函数反复调用自己,直到执行到最终结果,然后跳出。
举个栗子:

//5的n!
function f(num){
if(num<=0){
return 1;
}else{
return num*f(num-1);
}
}
f(5);

上面的函数表面看起来没有问题,但是下面的代码可能会导致它出错

var another=f();
f=null;
alert(another(4));

以上代码先把f()函数保存在变量another中,然后将f变量设置为null;但接下来调用another()时,必须执行f(),而此时f已不再是函数,所以就会导致错误,在这种情况下,使用arguments.callee可以解决这个问题。
arguments.callee是一个指向正在执行函数的指针,因此可以用它来实现递归函数的调用,如下:

function f(num){
if(num<=0){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
f(5);

通过使用arguments.callee代替了函数名,这样无论怎样调用函数都不会出现问题。但是在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致出错,在这种情况下,可以使用命名函数表达式来实现相同的结果。例如:

var factorial=(function f(num){
if(num<=0){
return 1;
}else{
return num*f(num-1);
}
});
factorial(5);

以上代码创建了一个名为f()的命名表达式,然后将它赋值给变量factorial,即使把函数赋给了另一个变量,函数f()仍然有效,所以递归调用能正常完成。这种方式在严格模式和非严格模式下都能完成。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: