function foo(a) {
if (a == 1) {
return a
}
if (a > 1) {
return a * foo(a - 1)
}
}
console.log(foo(3))
第二行如果写成a=1,则会进行赋值操作,结果永远为1,==判断a的值是否为1
或者也可以写为 a <= 1
var foo2 = foo
f00 = null
alert(foo2(3))
解决方法一:
如果此时把递归函数保存为其他变量名时,由于在函数内部使用了 原函数名,导致错误,这是我们可以通过使用arguments,callee来解决这个问题
arguments.callee 是一个指向正在执行的函数的指针,因此可以用它来实现对函数的递归调用,上例可以修改为:
function foo(a) {
if (a == 1) {
return a
}
if (a > 1) {
return a * arguments.callee(a - 1)
}
}
console.log(foo(3))
但在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会报错(值得注意的是,arguments是个很大的对象,每次递归调用时都需要重新创建,影响浏览器的性能)
arguments的优点:
arguments为函数内部对象,包含传入函数的所有参数,arguments.callee代表函数名,多用于递归调用,防止函数执行与函数名紧紧耦合(紧紧耦合是指当函数名发生变化时,函数执行会遇到问题)的现象,对于没有函数名的匿名函数也非常起作用
解决方法二:
可以使用函数表达式来达到同样的效果