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 相关文章推荐
javascript编程起步(第四课)
Feb 27 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
Oct 29 Javascript
使用IE6看老赵的博客 jQuery初探
Jan 17 Javascript
让你的CSS像Jquery一样做筛选的实现方法
Jul 10 Javascript
用js实现小球的自由移动代码
Apr 22 Javascript
js操作iframe的一些方法介绍
Jun 25 Javascript
JS获取各种宽度、高度的简单介绍
Dec 19 Javascript
JavaScript 数组- Array的方法总结(推荐)
Jul 21 Javascript
利用python分析access日志的方法
Oct 26 Javascript
解决在vue项目中,发版之后,背景图片报错,路径不对的问题
Mar 06 Javascript
react 国际化的实现代码示例
Sep 14 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
Apr 19 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
PHP实现获取图片颜色值的方法
2014/07/11 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
js断点调试经验分享
2017/12/08 Javascript
Node.js爬取豆瓣数据实例分析
2018/03/05 Javascript
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
使用JavaScrip模拟实现仿京东搜索框功能
2019/10/16 Javascript
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
英国Boots旗下太阳镜网站:Boots Designer Sunglasses
2018/07/07 全球购物
国家助学金获奖感言
2014/01/31 职场文书
白酒市场营销方案
2014/02/25 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
大学生社会服务心得体会
2016/01/22 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python