千家信息网

web中如何优化尾调用

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章主要为大家展示了"web中如何优化尾调用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"web中如何优化尾调用"这篇文章吧。尾调用从字面理解,自然而
千家信息网最后更新 2025年11月16日web中如何优化尾调用

这篇文章主要为大家展示了"web中如何优化尾调用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"web中如何优化尾调用"这篇文章吧。


尾调用

从字面理解,自然而言就是在函数的尾部返回一个函数的调用,通常来说,指的是函数执行的最后一步。

举个例子

const fn = () => f1() || f2()// 这里的话, f2函数有可能是尾调用,f1不可能是尾调用

为什么f1函数不是呢,我们看这个函数的等价形式

const fn = function () {    const flag = f1()    if(flag) {        return flag    } else {        return f2()    }}

似乎写到这里,根据尾调用定义,我们就明白了,只有f2函数是在尾部调用。

说到这里,为什么要说尾调用呢?我们事先想一想传统的递归,典型的就是首先执行递归调用,然后根据这个递归的返回值并结算结果,那么传统的递归缺点有哪些呢

  • 效率低,占内存。

  • 如果递归链过长,可能会stack overflow

那么我们是不是可以做优化呢,这就可以涉及上面提到的尾调用,它的原理是啥呢

按照阮一峰老师在es6的函数扩展中的解释就是:函数调用会在内存形成一个"调用记录",又称"调用帧"(call frame),保存调用位置和内部变量等信息。如果在函数A的内部调用函数B,那么在A的调用帧上方,还会形成一个B的调用帧。等到B运行结束,将结果返回到AB的调用帧才会消失。如果函数B内部还调用函数C,那就还有一个C的调用帧,以此类推。所有的调用帧,就形成一个"调用栈"(call stack)。

这里的"调用帧"和"调用栈",说的应该就是"执行环境"和"调用栈"。因为尾调用时函数的最后一部操作,所以不再需要保留外层的调用帧,而是直接取代外层的调用帧,所以可以起到一个优化的作用。

从上述的描述中,我们视乎可以理解成

  • 它的原理类似于当编译器检测到一个函数调用是尾递归时,它会覆盖当前的活动记录而不是在函数栈中创建一个新的调用记录

  • 这样子,我们也可以理解成,不同的语言编译器或者是解释器做了尾递归优化,才让它不会爆栈。

既然是这样子的话,尾递归的优化,取决于浏览器,那具体有哪些主流浏览器支持呢

safari 和火狐,有兴趣的可以去了解一下,可以写个斐波那契数列数列验证一下。

手动优化

既然我们知道了,很多浏览器对于尾递归的优化支持的浏览器并不多,那你会好奇,当我们使用尾递归进行优化的时候,依然出现栈溢出的错误,那么我们如何解决呢?

我在网上看到一个不错的方案,采用的是蹦床函数

function trampoline(f) {  while (f && f instanceof Function) {    f = f();  }  return f;}

那么如何使用呢

我们拿最常见的斐波那契数列来说吧

function fibonacci(n) {  if (n === 0) return 0  if (n === 1) return 1  return fibonacci(n - 1) + fibonacci(n - 2)}

根据上面的式子,我们可以将其写成迭代形式,用一个变量去缓存它的值

function fibonacci (n, ac1 = 0, ac2 = 1) {    return n

以上是"web中如何优化尾调用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

函数 递归 就是 浏览器 浏览 内容 数列 篇文章 传统 内存 原理 变量 外层 尾部 形式 是在 样子 结果 编译器 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 邮件服务器软件下载 光遇登录服务器失败要等多久 服务器生存第十期视频 软件开发电脑配置项目优势 软件开发高级工程师招聘最新信息 中山无线软件开发优化价格 界面软件开发工程师招聘 淘客服务器挂机教程 洛阳金蝶出纳软件开发 数据库服务器存放的数据在哪里 数据库基础sql语句 足球经理2010数据库制作 光盘数据库怎么查询系统 数据库标签分为哪两种标签 苏州h3c刀片服务器多少钱 公司文件管理服务器配置 计算机网络技术第2版 计算机三级网络技术安全 软件开发可以加计扣除吗 数据库概念模型中的三种基本联系 王者荣耀福禄兄弟在哪个服务器 sql数据库记录数量 网络安全行业宏观环境分析 北京臻盛网络技术有限 mysql读取sql数据库 服务器4210r可兼容的内存 知乎的服务器 网络技术安全工作领导小组 曙光服务器管理卡怎么重启 护苗2019 网络安全课
0