[js] 举例说明js中什么是尾调用优化

[js] 举例说明js中什么是尾调用优化

  1. 写在前面

上次介绍了什么是尾调用以及怎么准确快速的判别一个函数调用是否为尾调用。那么,我们判别尾调用的意义是什么呢?做什么事情总归有个目的,那么今天我们就来系统的介绍一下尾调用的意义,或者说尾调用有什么用吧。
2. 尾调用优化

我们知道,函数的调用会在内存中生成一个“调用帧”(call frame),保存着函数的调用位置和内部变量等信息。如果在函数A的内部调用函数B,那么在A的调用帧上方还会生成一个B的调用帧。等到函数B运行结束,将结果返回到A,B的调用帧才会消失。如果函数B的内部还调用函数C,那么在B的调用帧上方又会生成一个C的调用帧,以此类推。所有的调用帧就形成了一个“调用栈”(call stack)。

我们知道,尾调用是函数的最后一步操作,外部函数的调用位置和其内部变量信息都不会再用到了,所以不需要保留外部函数的调用帧了,直接用内层函数的调用帧取代外层函数的调用帧即可。

如果所有的函数都是尾调用,那么完全可以做到每次执行时的调用帧只有一项,这将大大的节省内存,更不可能发生内存溢出,这就是讨论尾调用的意义所在。

所谓的“尾调用优化”,其实就是保证在函数执行时只保留内层函数的调用帧,换句话说,就是用内层函数的调用帧取代外部函数的调用帧,即执行时内存中只保存一项调用帧。
3. 如何做到尾调用优化

通过上面的讨论,我们知道了,只要外部函数的调用帧被内层函数的调用帧取代即可做到“尾调用优化”。同时,我们也知道调用帧是用来保存函数调用位置和内部变量信息的,所以,要想让内层函数的调用帧取代外部函数的调用帧,只需要保证,在调用内层函数时,不再用到和外部函数有关的一切信息即可(不再用到外部函数的内部变量)。

如此,我们总结出只有内层函数在被调用时不再用到外部函数的内部变量,才能做到“尾调用优化”。

先来,看一个例子:

function f(a) {var b = 3;function g(n) {return n + b}return g(a)
}

上述例子,我们明显可以看出这是典型的尾调用,那么这有没有做到“尾调用优化”呢?很明显,可以看出在调用内部函数g的时候,其内部用到外部函数f 的内部变量b,故在函数g 被调用时,g 的调用帧并不能取代外部函数f 的调用帧,所以这不是“尾调用优化”。

个人简介

我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易,
但坚持一定很酷。欢迎大家一起讨论

主目录

与歌谣一起通关前端面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之路——内置函数和匿名函数

楔子 在讲新知识之前,我们先来复习复习函数的基础知识。 问:函数怎么调用? 函数名() 如果你们这么说。。。那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题。。。 来你们在自己的环境里打印一下自己的名字…

SpringBoot打包成Docker镜像

1. 本文环境 Maven:3.6.3 (Maven配置参考) SpringBoot version:2.3.4.RELEASE Docker version: 19.03.11 (Docker搭建参考) JDK version:1.8.0_221 (JDK搭建参考&…

[js] 如何判断两个对象相等?

[js] 如何判断两个对象相等? 提供另一种写法:function isSameObject(object1, object2) {if (Object.prototype.toString.call(object1) [object Object] &&Object.prototype.toString.call(object2) [object Object]) {if (Object.keys(obje…

南京市儿童医院用医保身份(医保通道)网上预约挂号以及取号、付费看病流程...

1、到http://www.nj12320.org去注册,并实名认证(可以用南京市民卡或者工行卡实名认证) 2、到12320去挂儿童医院的号,我看了下只能挂副主任医师或者主任医师,或者按科室提前挂号,至少需要提前一天预约挂号&a…

Redis分布式锁—SETNX+Lua脚本实现篇

前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题。 针对分布式锁的实现,目前比较常用的就如下几种方案:…

[js] 字符串拼接有哪些方式?哪种性能好?

[js] 字符串拼接有哪些方式?哪种性能好? 1.使用 号 2.es6模板字符串,以反引号( )标识 3.concat 4.数组方法join性能最好的是连接: 继续补充:Array.prototype.reduceString.prototype.padSta…

Windows10远程报错:由于CredSSP加密Oracle修正

https://support.microsoft.com/zh-cn/help/4093492/credssp-updates-for-cve-2018-0886-march-13-2018 参照官方更新文件:查找办法 https://support.microsoft.com/zh-cn/help/4093492/,4093492是更新包kb后面的数字 修改办法:下图参照注册表…

Redis分布式锁—Redisson+RLock可重入锁实现篇

前言 平时的工作中,由于生产环境中的项目是需要部署在多台服务器中的,所以经常会面临解决分布式场景下数据一致性的问题,那么就需要引入分布式锁来解决这一问题。 针对分布式锁的实现,目前比较常用的就如下几种方案:…

[js] localStorage什么时候过期?

[js] localStorage什么时候过期? 默认不会过期,除非清楚浏览器缓存或者手动删除,可以通过setItem里面缓存时间参数,取出来后做一个前后时间对比,如果超过时间限制的话就删除该缓存即可。个人简介 我是歌谣&#xff0…

angular安装记录

1. 安装node.js,下载地址:https://nodejs.org/en/download/,详细的安装教程参考这里:https://blog.csdn.net/u010255310/article/details/52205132 直接一路next就可以。安装好node后,会自动在path中配置了node的安装路…

[js]写一个获取非行间样式的方法

[js]写一个获取非行间样式的方法 window.getComputedStyle()?window.getComputedStyle(element).attribute:element.currentStyle.attribute个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 …

Docker (1) 基本概念和安装

Docker简介 什么是容器? 一种虚拟化的方案,操作系统级别的虚拟化。容器是一个轻量的、独立的、可执行的包,包含了执行它所需要的所有东西:代码、运行环境、系统工具、系统库、设置。很长一段时间中,容器是专门用于Linu…

[js] 写一个获取页面中所有checkbox的方法

[js] 写一个获取页面中所有checkbox的方法 function getAllCheckbox() {return [...document.querySelectorAll(input[typecheckbox])] }个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌…

vue获取浏览器地址栏参数(?及/)路由+非路由实现方式

1、? 参数 浏览器参数形式&#xff1a;http://javam4.com/m4detail?id1322914793170014208 1.1、路由取参方式 this.$route.query.id前端跳转方式&#xff1a; 一、onclick方式 <a title"测试数据"click"test(row.id)"target"_blank"&g…

python3.X 使用pip 离线安装whl包(转载)

转载https://blog.csdn.net/wangyaninglm/article/details/54177720 0. 绪论 断网的环境下配置python开发环境非常讨厌&#xff0c;本文旨在优雅暴力的解决这一问题。 生产环境 &#xff1a; windows 7 windows10 python 3.5.2 pip 1.5.2 友情提示&#xff1a;出现问题时候&…

[js] XML与JSON有什么的区别?

[js] XML与JSON有什么的区别&#xff1f; xml 可以设 id&#xff0c;用 include 之类的可以直接引用过来&#xff0c;甚至可以约定内容格式。 但 json 不依赖 js 等语言就很难完成了。好吧&#xff0c;广义上来讲&#xff0c; json 编译更简单易懂&#xff0c;体积更小&#x…

@RequestParam,@RequestBody,@PathVariable注解还分不清吗?

前言 在使用 SpringMVC 开发时&#xff0c;经常遇到前端传递的各种参数&#xff0c;比如 form 表单&#xff0c;JSON 数据&#xff0c;String[] 数组&#xff0c;再或者是最常见的 String 字符串等等&#xff0c;总之大部分场景都是在标题这三个注解来回切换&#xff0c;所以搞…

Android | Sqlite3

Android 数据库创建及使用: 创建: package he3.sd.dao;import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log;/*** Created by asd25 on 2018/6/11 0011.*/public clas…

[js] flash如何与js交互?

[js] flash如何与js交互&#xff1f; 当Flash置于HTML容器中时&#xff0c;经常会遇到AS与JS的通信问题&#xff0c;例如&#xff1a;JS能否调用AS中的变量、方法&#xff0c;AS能否调用JS中的变量、方法等等。答案是肯定的。随着技术的不断发展&#xff0c;解决方案也是多种多…

PHP文件下载

步骤 //流的方式发送给浏览器 header("Content-Type: application/octet-stream"); //按照字节的返回给浏览器 header("Accept-Ranges: bytes"); //告诉浏览器文件的大小 header("Accept-Length: ".filesize(文件地址)); //以附件的形式发送给浏…