今天学习js红宝书递归 记一下笔记加深印象
一般的递归的写法:
function factrial(num) {
if (num <= 1) {
return 1
} else {
return num * factrial(num - 1)
}
}
var result = factrial(4)
这种写法如果使用下面的写法就会出现问题
var anotherFactrial=factrial;
factrial = null
anotherFactrial(5)
先把factrial函数赋值给anotherFactrial变量,然后将factrial变量设置为null(个人不太明白为什么这个写,明白的大佬请评论区赐教),然后再调用factrial的时候,factrial已经是null 所以会报错
TypeError: factrial is not a function
这种情况可以使用arguments.callee解决
argument.callee 的作用是指向正在执行的函数的指针,
修改之后的写法
function factrial(num) {
if (num <= 1) {
return 1
} else {
return num * arguments.callee(num - 1)
}
}
在严格模式下,不能访问arguments.callee属性 可以通过明明函数表达式来解决问题
(function f(num) {
if (num <= 1) {
return 1
} else {
return num * f(num - 1)
}
})
以上代码创建了名为f()的命名函数表达式,然后将它赋值给变量factrial,这样把factrial赋值给anotherFactrial的时候赋值的是表达式 而不是f函数 factrial为置null的时候 f函数依然存在 解决问题