函数递归的几种方式
前言
function a (num) {
if (num <= 1) {
return 1
} else {
return num * a(num - 1)
}
}
var b = a
console.log(b(2)) // 2
console.log(typeof(a)) // function
var b = a
a = null
console.log(b(2)) // a is not a function
报错的原因在于在函数体内部会调用 a 函数,而变量 a 对函数的引用已经被解除所以报错
arguments.callee
- 始终指向当前的函数
- 多用于递归调用,防止函数执行与函数名紧紧耦合的现象
- 对于没有函数名的匿名函数也非常起作用
- 严格模式 下不能使用 arguments.callee
function a (num) {
if (num <= 1) {
return 1
} else {
return num * arguments.callee(num - 1)
}
}
var b = a
a = null
console.log(b(2)) // 2
严格模式下函数的递归
var b = function a (num) {
if (num <= 1) {
return 1
} else {
return num * a(num - 1)
}
}
// a is not defined(此时 a 属于局部变量)
// typeof(b) (function)
console.log(b(2)) // 2
非严格模式下匿名函数的递归
var b = function (num) {
if (num <= 1) {
return 1
} else {
return num * arguments.callee(num - 1)
}
}
b(2) // 2
立即执行函数
(function (num) { //必须加上运算符,让引擎知道不是函数声明,而是函数表达式
if (num <= 1) {
return 1
} else {
return num * arguments.callee(num - 1)
}
})(2)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: JS Module 的加载实现
下一篇: TypeScript 常见问题
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论