详解JS函数stack size计算方法


Posted in Javascript onJune 18, 2018

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

如果你写了一个一直调用自身的死循环,那么恭喜你,很快就可以看到报错:Uncaught RangeError: Maximum call stack size exceeded。那么这个call stack size有多少呢?

1. 计算方法

如下的方法可以为你计算出你使用的JavaScript引擎可以支持多深的调用(由Ben Alman的一段代码获得灵感):

function computeMaxCallStackSize() {
    try {
      return 1 + computeMaxCallStackSize();
    } catch (e) {
      // Call stack overflow
      return 1;
    }
  }

运行得到如下三个结果:

  • Node.js: 11034
  • Firefox: 50994
  • Chrome: 10402

这些数字代表了什么呢?Mr.Aleph告诉我在V8,可调用的层数基于两个方面:1. 栈的大小;2. 每一栈帧的大小(用于记录函数参数和局部变量)。你可以在computeMaxCallStackSize声明局部变量来测试,你会发现数字变小。

2. ECMAScript 6中尾递归优化

ECMAScript 6支持尾递归优化:如果一个函数的最后一个操作是函数调用,那么将会用“跳转”而不是“子调用”。也就是说如果你将computeMaxCallStackSize重写成如下形式,在ES6的严格模式下,就会一直运行了。

function computeMaxCallStackSize(size) {
    size = size || 1;
    return computeMaxCallStackSize(size + 1);
  }

3. 亮点评论

  • Andrei: “ECMAScript 6”版本的代码根本跑不通。虽然size会被更改,但是最终并没有值返回。
  • 回复Andrei: 有趣!你不能用这段代码去计算stack size。在ES6下,这段代码会一直运行,因此不会返回数据。在其它情况下,会返回RangeError。为了使其工作,我把代码重写了一下:
var computeMaxCallStackSize = (function() {
 return function() {
  var size = 0;
  function cs() {
   try {
    size++;
    return cs();
   } catch(e) {
    return size + 1;
   }
  }
  return cs();
 };
}());
Javascript 相关文章推荐
javascript 最常用的10个自定义函数[推荐]
Dec 26 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
Feb 23 Javascript
JS Replace 全部替换字符的用法小结
Dec 24 Javascript
jquery1.9 下检测浏览器类型和版本的方法
Dec 26 Javascript
JavaScript中对象property的读取和写入方法介绍
Dec 30 Javascript
JavaScript模拟鼠标右键菜单效果
Dec 08 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
Jun 20 Javascript
JavaScript学习笔记之函数记忆
Sep 06 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
Nov 08 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
Sep 24 Javascript
Vue请求java服务端并返回数据代码实例
Nov 28 Javascript
Element图表初始大小及窗口自适应实现
Jul 10 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 #jQuery
node.js自动上传ftp的脚本分享
Jun 16 #Javascript
Vue中props的使用详解
Jun 15 #Javascript
基于jQuery实现的设置文本区域的光标位置
Jun 15 #jQuery
深入浅析Vue全局组件与局部组件的区别
Jun 15 #Javascript
react-native android状态栏的实现
Jun 15 #Javascript
JS实现监控微信小程序的原理
Jun 15 #Javascript
You might like
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
PHP实现文件下载详解
2014/11/27 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
PHP实现简单登录界面
2019/10/23 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
采用怎样的方法保证数据的完整性
2013/12/02 面试题
PyQt QMainWindow的使用示例
2021/03/24 Python
大学本科毕业生的自我鉴定
2013/11/26 职场文书
中英文求职信范文
2014/01/27 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang