函数递归的几种方式

发布于 2024-09-15 22:26:15 字数 1481 浏览 30 评论 0

前言

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

  1. 始终指向当前的函数
  2. 多用于递归调用,防止函数执行与函数名紧紧耦合的现象
  3. 对于没有函数名的匿名函数也非常起作用
  4. 严格模式 下不能使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

つ低調成傷

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

末蓝

文章 0 评论 0

年少掌心

文章 0 评论 0

党海生

文章 0 评论 0

飞翔的企鹅

文章 0 评论 0

鹿港小镇

文章 0 评论 0

wookoon

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文