iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >web中如何优化尾调用
  • 329
分享到

web中如何优化尾调用

2023-06-27 10:06:14 329人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“WEB中如何优化尾调用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“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中如何优化尾调用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: web中如何优化尾调用

本文链接: https://www.lsjlt.com/news/309706.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • web中如何优化尾调用
    这篇文章主要为大家展示了“web中如何优化尾调用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中如何优化尾调用”这篇文章吧。尾调用从字面理解,自然而言就是在函数的尾部返回一个函数的调用,通...
    99+
    2023-06-27
  • HTML5中如何使用requestAnimationFrame优化Web动画
    这篇文章主要介绍了HTML5中如何使用requestAnimationFrame优化Web动画,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。...
    99+
    2024-04-02
  • web网站优化为什么要从长尾开始
    今天就跟大家聊聊有关web网站优化为什么要从长尾开始,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。如今网站优化互助很是大,一些热门关键词基础底细都是...
    99+
    2024-04-02
  • web前端中如何优化图片
    这篇文章给大家介绍web前端中如何优化图片,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。对于在网站优化时,图片也是要得优化的。随着互联网搜索技术的发展,以往不能被搜索引擎“读懂”的图片...
    99+
    2024-04-02
  • 详解Python如何实现尾递归优化
    目录一般递归与尾递归一般递归尾递归C中尾递归的优化Python开启尾递归优化一般递归与尾递归 一般递归 def normal_recursion(n): if n == 1:...
    99+
    2024-04-02
  • win11 wsa gpu调用如何优化
    本篇内容主要讲解“win11 wsa gpu调用如何优化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win11 wsa gpu调用如何优化”吧!首先打开开始菜单里的“设置” 接着打开右边的“屏...
    99+
    2023-07-02
  • JavaScript调用栈、尾递归和手动优化的示例分析
    这篇文章给大家分享的是有关JavaScript调用栈、尾递归和手动优化的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。调用栈(Call Stack)调用栈(Call St...
    99+
    2024-04-02
  • MariaDB中如何进行性能优化调优
    MariaDB 是 MySQL 的一个分支,因此在进行性能优化调优时,可以遵循类似的步骤。以下是一些常见的性能优化调优方法: 使...
    99+
    2024-04-02
  • C++ 函数优化详解:如何优化调用栈?
    调用栈是函数调用的堆栈式记录,影响性能的主要因素包括上下文切换开销、栈溢出风险和缓存不命中。优化调用栈的技术包括减少调用深度、使用尾递归优化、使用内联函数、使用局部变量和使用智能指针。 ...
    99+
    2024-05-02
    c++ 函数优化
  • Golang如何优化Web开发?
    Golang如何优化Web开发? 随着互联网的快速发展,Web开发变得愈发重要,各种编程语言也应运而生。其中,Golang(又称Go语言)作为一种由Google开发的编程语言,因其简洁...
    99+
    2024-03-06
    性能优化 并发编程 路由设计 go语言 标准库
  • Nginx如何优化调整
    这篇文章将为大家详细讲解有关Nginx如何优化调整,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、网络层面带宽带宽对Nginx性能的影响是最为直接的,就算如何独享10M的带宽也肯定不如100M带宽下Ng...
    99+
    2023-06-04
  • PHP 应用程序性能优化中 Web 服务器配置的调优
    通过调优 web 服务器配置,可以优化 php 应用程序性能,具体方法包括:调整线程池大小,优化并发请求处理;设置 keepalive 超时,平衡延迟和资源消耗;设置连接限制,防止资源耗...
    99+
    2024-05-01
    php 服务器配置 css 并发请求
  • 如何调用Web API
    本篇内容介绍了“如何调用Web API”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一步:打开开发者工具,找一个 JSON 响应...
    99+
    2023-06-29
  • 如何在MySQL中进行性能优化和调优
    有几种方法可以在MySQL中进行性能优化和调优: 使用合适的索引: 索引可以加快查询的速度。确保在经常使用的列上创建索引,并避免...
    99+
    2024-04-09
    MySQL
  • 在AmazonAurora中如何进行性能调优和优化
    Amazon Aurora是一种关系型数据库服务,旨在提供高性能、高可靠性和可扩展性。要进行性能调优和优化,可以按照以下步骤进行: ...
    99+
    2024-04-09
    AmazonAurora
  • VB.NET如何调用Web Service
    这篇文章将为大家详细讲解有关VB.NET如何调用Web Service,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。VB.NET调用Web Service提供服务来编写数据库应用程序的具体步骤,: 启动V...
    99+
    2023-06-17
  • web应用服务器的性能如何优化
    web应用服务器性能优化的方法:1、根据自身需求选择操作系统和对应的JDK的版本,并设置合适的内存规模;2、把Apache和Tomc...
    99+
    2023-02-08
    web应用服务器 服务器
  • PHP8如何使用Named Arguments优化函数调用?
    近日,PHP8正式发布,其中最引人注目的功能之一是Named Arguments(命名参数)。这个特性使得函数调用更具可读性和易维护性,使得代码可读性更高,也能大幅减少在编程中的犯错概率。本文将介绍PHP8的命名参数及其如何优化函数调用,且...
    99+
    2023-10-28
    PHP 函数调用 named arguments
  • web开发中如何优化完善网站内链
    小编给大家分享一下web开发中如何优化完善网站内链,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!顾名思意,内链就是在同一网站域名...
    99+
    2024-04-02
  • C++ 函数的递归实现:如何使用尾递归优化技术?
    递归函数的效率问题可以通过尾递归优化 (tc++o) 技术解决。c++ 编译器虽然不支持 tco,但可以通过 [__tail_recursive](https://en.cpprefer...
    99+
    2024-04-22
    c++ 递归
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作