详解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 相关文章推荐
js利用与或运算符优先级实现if else条件判断表达式
Apr 15 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
javascript获取隐藏dom的宽高 具体实现
Jul 14 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
Jan 24 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
深入学习jQuery中的data()
Dec 22 Javascript
jQuery+pjax简单示例汇总
Apr 21 jQuery
Vue组件实例间的直接访问实现代码
Aug 20 Javascript
vue-cli axios请求方式及跨域处理问题
Mar 28 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
May 05 Javascript
简单了解JavaScript异步
May 23 Javascript
vue修饰符.capture和.self的区别
Apr 22 Vue.js
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
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
windows的文件系统机制引发的PHP路径爆破问题分析
2014/07/28 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
Eval and new funciton not the same thing
2012/12/27 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
小程序云开发实战小结
2018/10/25 Javascript
通过jQuery学习js类型判断的技巧
2019/05/27 jQuery
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
微信小程序云函数添加数据到数据库的方法
2020/03/04 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python中property函数用法实例分析
2018/06/04 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
python3 Scrapy爬虫框架ip代理配置的方法
2020/01/17 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
Ralph Lauren法国官网:美国高品味时装品牌
2017/12/08 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
农村婚礼证婚词
2014/01/08 职场文书
高级编程求职信模板
2014/02/16 职场文书
个人创业事迹材料
2014/12/30 职场文书
2016党校学习心得体会范文
2016/01/07 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Anaconda安装pytorch及配置PyCharm 2021环境
2021/06/04 Python