递归函数就是在函数内部调用这个函数本身。
例如:
function f(num) {
if (num <=1) {
return 1;
} else {
return num + f(num - 1);
}
}
JavaScript具有很强的灵活性,这种灵活性导致对于上面的变量声明式,函数f的值很容易被替换。
函数是一个值,他被赋给fn,那么fn(5)应该可以计算出结果,但是由于函数内部仍然引用的是变量f,所以 它并不能正常计算出结果。
为了解决这个问题,我们可以使用函数内部的对象arguments的callee属性,这是一个指向正在执行函数的指针。
var fn = function f(num) {
if (num <=1) {
return 1;
} else {
return num + arguments.callee(num - 1);
}
}
这样无论我们怎样修改函数名,递归的目的始终能够得到实现。
但是这样又引发了另一个问题,严格模式下不能通过脚本访问上述属性,因此我们使用命名函数表达式来实现相同的效果。
var fac = (function f(num) {
if (num <= 1) {
// console.log('A被调用了');
return 1;
} else {
// console.log('B被调用了');
return num * f(num - 1);
}
})
alert(fac(3));
经过检验,可以很好的使用。
我是一个 新人,欢迎大佬们前来批评指正。