ECMA Script6 中的 尾调用优化
在读 《深入理解ES6》一书中,看到有关函数的 “尾调用优化” 章节,特此记录一下
尾调用 指的是 函数作为另一个函数的最后一条语句被调用:
function foo () {
return bar();
}
书中说 在 ES5 的时候,尾调用的实现与其他函数调用类型,创建一个新的帧栈,然后将它推入调用栈表示调用,也就是说在循环调用中,每个未执行完的帧栈都保存在内存中,当调用栈变的过大会造成性能问题.
ES6 的优化
严格模式下,缩减了尾调用栈的大小;非严格模式不受影响,如果满足以下条件,尾调用不再创建新的帧栈,而是服用当前帧栈.
尾调用不访问当前帧栈的变量(非闭包)
在函数内部,尾调用是最后一条语句
尾调用的值作为结果返回
看如下例子:
// 可以优化 "use strict";
function foo() {
return bar();
}
// 无法优化 -> 函数调用没有作为值返回; function foo() {
bar();
}
// 无法优化 -> 此处 函数并没有直接被返回,而是执行了一步操作
"use strict"; function foo() {
return 1 + bar();
}
// 无法优化 -> 调用不在尾部 function foo() {
var result = bar();
return result;
}
// 无法优化,闭包! "use strict"; function foo() {
var num = 1,
getNum = () => num;
return getNum();
}
因为尾调用优化是执行在JS 引擎上的优化,在我们实际的开发中的应用场景是什么呢?
场景1: 获取一个固定格式的日期
function getDate() {
return createDateTime(true);
} function getTime() {
return createDateTime(false);
} function createDateTime(date) {
// ...
return date ? 'YY-MM-DD':'YY-MM-DD hh:mm:ss'
}
场景2:递归
function factorial(n,p=1) {
if(n <= 1) {
return n*p;
}else {
let result = n * p;
return factorial(n-1,result);
}
}
ECMA Script6 中的 尾调用优化的更多相关文章
- JavaScript中的尾调用优化
文章来源自:http://www.zhufengpeixun.com/qianduanjishuziliao/javaScriptzhuanti/2017-08-08/768.html JavaScr ...
- 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- JavaScript 中的尾调用
尾调用(Tail Call) 尾调用是函数式编程里比较重要的一个概念,它的意思是在函数的执行过程中,如果最后一个动作是一个函数的调用,即这个调用的返回值被当前函数直接返回,则称为尾调用,如下所示: f ...
- ES6躬行记(15)——箭头函数和尾调用优化
一.箭头函数 箭头函数(Arrow Function)是ES6提供的一个很实用的新功能,与普通函数相比,不但在语法上更为简洁,而且在使用时也有更多注意点,下面列出了其中的三点: (1)由于不能作为构造 ...
- js 调用栈机制与ES6尾调用优化介绍
调用栈的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用栈的工作方式以及如何在工作中利用这一特性,大部分人可能没有进行过更深入的研究,这块内容可以说对我们前端来说就是所谓的基础 ...
- ES6学习笔记 -- 尾调用优化
什么是尾调用? 尾调用(Tail Call)是函数式编程的一个重要概念,就是指某个函数的最后一步是调用另一个函数. function f(x) { return g(x) } 如上,函数 f 的最后一 ...
- PHP、Lua中的 尾调用
在程序设计中,递归(Recursion)是一个很常见的概念,合理使用递归,可以提升代码的可读性,但同时也可能会带来一些问题. 下面以阶乘(Factorial)为例来说明一下递归的用法,实现语言是PHP ...
- iOS 的尾调用优化原理
背景: 今天聊代码规范的问题的时候说了一下尾调用的问题. 一:概念: 什么是尾调用? 尾调用(Tail Call):某个函数的最后一步仅仅只是调用了一个函数(可以是自身,可以是另一个函数). 注意 “ ...
- JS的递归与TCO尾调用优化
转自:https://segmentfault.com/a/1190000004018047 这两天搜了下JS递归的相关文章, 觉得这篇文章很不错, 就顺手翻译了下,也算给自己做个笔记,题目是我自己加 ...
- ES6 之 函数的扩展 尾调用以及尾递归
函数参数的默认值 function log(x, y) { y = y || 'world' console.log(x + ' ' + y); } log('hello') // hello wor ...
随机推荐
- SpringBoot 处理xss攻击
添加依赖 <!-- xss跨站脚本攻击 --> <dependency> <groupId>net.dreamlu</groupId> <arti ...
- Aspose 导出Excel时 隐藏指定列
Worksheet ws = wb.Worksheets[0]; ws.Cells.HideColumn(0); //隐藏Excel第一列
- 类、事件与对象---Dad&Mom&Friends(进阶事件)
接上一个笔记:https://www.cnblogs.com/StephenYoung/p/17792668.html 现在增加了一个新的朋友类:Friends 这个类构造如下: 从上到下依次是: 1 ...
- influxdb得导出与导入
转载请注明出处: 1.备份元数据 基本语法: influxd backup <path-to-backup> 备份元数据,没有任何其他参数,备份将只转移当前状态的系统元数据到path-to ...
- BS架构和CS架构应用
概述 B/S结构即浏览器和服务器结构.它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构.在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Br ...
- oeasy教您玩转vim - 48 - # ed由来
范围控制 回忆上节课内容 我们这次研究了mark的定义和使用 mb定义 'b跳转 可以对marks,查询删除 三种marks 小写 本文件内 大写 跨文件 数字 配置文件中 甚至可以在行编辑中,使 ...
- oeasy教您玩转vim - 38 - # 配合移动
快速删除 回忆上节课内容 以前知道可以在插入状态下使用 del.退格 进行删除 现在知道了默认状态下使用通过 x 删除字符 可以在 x 前面使用[count]进行翻倍 如 10x 删除的字符存储在 ...
- Visual Studio 必备插件集合:AI 助力开发
一.前言 2024年AI浪潮席卷全球,编程界迎来全新的挑战与机遇.智能编程.自动化测试.代码审查,这一切都得益于AI技术的迅猛发展,它正在重塑开发者的日常,让编写代码变得更加高效.智能. 精选出最受 ...
- App如何利用推送消息有效实现拉新促活?
对于大多数App来说,如何快速建立与用户的联系.提高用户活跃度.提升用户转化率,是产品运营过程中十分关心的问题,在常见的运营手段中,Push推送消息以其高性价比成为首选策略.但在实际运营过程中,推送消 ...
- 开源新纪元:Llama 3.1超大杯405B跑分惊艳,首次超越GPT-4o,下载链接曝光!
开源巨擘Llama 3.1崭露头角,性能卓越引发热议 在科技界的瞩目下,Llama 3.1系列模型以其卓越的性能脱颖而出,尤其是其405B超大杯版本,在微软Azure-ML GitHub平台的多项评测 ...