函数尾调用优化

尾调用

在编码过程中,经常涉及到函数调用函数,例如:

javascript 复制代码
function a() {
  b();
}

function b() {}

我们每次调用函数,都会在在内存中记录一个"调用帧"又成为"栈帧空间"

在上述例子中,调用a()函数,会在内存中记录一个调用栈,然后继续调用b()函数,此时在内存中又会记录一个调用帧,等到b()函数运行结束,调用帧a、b的内存才会释放。

我们可以利用"尾调用"来释放调用帧内存

javascript 复制代码
function a() {
  return b();
}

function b() {}

上述代码中,在函数的最后一步调用了b()函数,外层函数内存直接被释放,确认代之的是b()函数内存被创建,从复杂度来看,普通调用复杂度O(n),尾调用复杂度O(1)

尾调用并不是函数中的最后一行,而是最后一步,在下面的例子中,也可以实现尾调用

javascript 复制代码
function a(n) {
  if(n === 5){
    return b();  // 尾调用
  }
  return c(); // 尾调用
}

尾递归

递归函数就是函数调用自身,正常的递归函数会进行深层调用,每次调用函数都会创建内存,也就是上面所说的调用帧,直到递归函数执行完毕,内存才会被释放,如果递归函数层级过深,记录栈帧过多,会导致栈溢出错误。

我们可以利用尾调用来优化并释放内存,下面是一个尾递归函数

javascript 复制代码
/* 尾递归 */
function tailRecur(n, res) {
    // 终止条件
    if (n === 0) return res;
    // 尾递归调用
    return tailRecur(n - 1, res + n);
}
相关推荐
qingyingWin11 分钟前
原生微信小程序研发,如何对图片进行统一管理?
前端·微信小程序
不懂英语的程序猿21 分钟前
【JEECG】JVxeTable表格拖拽排序功能
前端·后端
拾光拾趣录26 分钟前
前端灵魂拷问:从URL到Redux,17个常见问题
前端·面试
萌萌哒草头将军34 分钟前
Prisma ORM 又双叒叕发布新版本了!🚀🚀🚀
前端·javascript·node.js
mldong1 小时前
推荐一款超高颜值的后台管理模板!Art-Design-Pro!开源!免费!
前端·vue.js·架构
草字1 小时前
uniapp 如果进入页面输入框自动聚焦,此时快速返回页面或者跳转到下一个页面,输入法顶上来的页面出现半屏的黑屏问题。
java·前端·uni-app
韩召华1 小时前
uniapp实现微信小程序导航功能
微信小程序·uni-app·notepad++
我是ed.1 小时前
cocos Js 使用 webview 通过 postMessage 进行通信
开发语言·javascript·ecmascript
程序视点1 小时前
Wise Duplicate Finder 重复文件查找工具 - 永久免费专业版文件去重工具
前端·windows
一点一木2 小时前
🚀 2025 年 07 月 GitHub 十大热门项目排行榜 🔥
前端·人工智能·github