JS的函数调用栈stack size的计算方法


Posted in Javascript onJune 24, 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 相关文章推荐
HTML5之lang属性与dir属性的详解
Jun 19 Javascript
jQuery表单域属性过滤器用法分析
Feb 10 Javascript
jQuery实现购物车计算价格功能的方法
Mar 25 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
jQuery实现网站添加高亮突出显示效果的方法
Jun 26 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
Oct 30 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
May 31 Javascript
Ionic如何实现下拉刷新与上拉加载功能
Jun 03 Javascript
JS实现复选框的全选和批量删除功能
Apr 05 Javascript
Vue工程模板文件 webpack打包配置方法
Dec 26 Javascript
JavaScript中将值转换为字符串的五种方法总结
Jun 06 Javascript
VSCode插件安装完成后的配置(常用配置)
Aug 24 Javascript
JavaScript中var、let、const区别浅析
Jun 24 #Javascript
使用JavaScript中的lodash编写双色球效果
Jun 24 #Javascript
Vue中$refs的用法详解
Jun 24 #Javascript
JS实现获取word文档内容并输出显示到html页面示例
Jun 23 #Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
Jun 23 #Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
Jun 22 #Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 #Javascript
You might like
仿AS3实现PHP 事件机制实现代码
2011/01/27 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
理解Angular的providers给Http添加默认headers
2017/07/04 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
Python中关键字is与==的区别简述
2014/07/31 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
对Python3中的input函数详解
2018/04/22 Python
wxPython实现画图板
2020/08/27 Python
pytorch 中pad函数toch.nn.functional.pad()的用法
2020/01/08 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
环保志愿者活动总结
2014/06/27 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
党的群众路线教育实践活动调研报告
2014/11/03 职场文书
2014年学校体育工作总结
2014/12/08 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python