样例:求n的阶乘
写法一:
function a(n) {
if (n > 1) {
return a(n - 1) * n
}
return 1
}
这样写缺点1是递归内部的函数名跟外部的函数定义名直接联系在一起了,如果出现以下这种情况就会报错:函数定义名被赋值空
function a(n) {
console.log(n)
if (n > 1) {
return a(n - 1) * n
}
return 1
}
// console.log(a(5))
var b = a
a = null
console.log(b(5))
缺点2是无法为匿名函数写递归
var b = function(n) {
console.log(n)
if (n > 1) {
return 函数名(n - 1) * n
}
return 1
}
写法2:使用argmuents.callee,改属性指向当前函数的定义,缺点是无法在严格模式下使用
function a(n) {
console.log(n)
if (n > 1) {
return arguments.callee(n - 1) * n
}
return 1
}
写法三:使用接受变量作为匿名函数内部的函数名
var b = function(n) {
console.log(n)
if (n > 1) {
return b(n - 1) * n
}
return 1
}