详解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 相关文章推荐
jQuery生成asp.net服务器控件的代码
Feb 04 Javascript
基于jQuery的树控件实现代码(asp.net+json)
Jul 11 Javascript
JS对象转换为Jquery对象实现代码
Dec 29 Javascript
jquery仿百度百科底部浮动导航特效
Aug 08 Javascript
分析js闭包引起的事件注册问题
Mar 29 Javascript
D3.js中强制异步文件读取同步的几种方法
Feb 06 Javascript
vue router2.0二级路由的简单使用
Jul 05 Javascript
Node.js readline模块与util模块的使用
Mar 01 Javascript
详解基于electron制作一个node压缩图片的桌面应用
Jan 29 Javascript
Layui点击图片弹框预览的实现方法
Sep 16 Javascript
ES6箭头函数和扩展实例分析
May 23 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
Nov 04 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
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
jquery获得下拉框值的代码
2011/08/13 Javascript
js中document.getElementByid、document.all和document.layers区分介绍
2011/12/08 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
Mongoose实现虚拟字段查询的方法详解
2017/08/15 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
python障碍式期权定价公式
2019/07/19 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
2020/02/24 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
英国户外装备商店:Ultimate Outdoors
2019/05/07 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
工商管理专业学生的自我评价
2013/10/01 职场文书
集团公司总经理岗位职责
2013/12/20 职场文书
环保口号大全
2014/06/12 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
教师个人发展总结
2015/02/11 职场文书
2015年全国科普日活动总结
2015/03/23 职场文书
爱护环境建议书
2015/09/14 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
HTML中的表格元素介绍
2022/02/28 HTML / CSS