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 相关文章推荐
表头固定(利用jquery实现原理介绍)
Nov 08 Javascript
web性能优化之javascript性能调优
Dec 28 Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
Apr 07 Javascript
javascript最基本的函数汇总
Jun 25 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
Apr 20 Javascript
artDialog+plupload实现多文件上传
Jul 19 Javascript
js判断手机号是否正确并返回的实现代码
Jan 17 Javascript
微信小程序实现顶部选项卡(swiper)
Jun 19 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 Javascript
简单了解Vue computed属性及watch区别
Jul 10 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中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
比较简单的一个符合web标准的JS调用flash方法
2007/11/29 Javascript
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
页面中body onload 和 window.onload 冲突的问题的解决
2009/07/01 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
2015/05/02 Python
在Python的Django框架中创建语言文件
2015/07/27 Python
浅谈Python处理PDF的方法
2017/11/10 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
2020/02/11 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
3个CCIE对一个工程师的面试题
2012/05/06 面试题
大专生工程监理求职信
2013/10/04 职场文书
水电站项目建议书
2014/05/12 职场文书
青年志愿者活动方案
2014/08/17 职场文书
企业领导对照检查材料
2014/08/20 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
学校党委干部个人对照检查材料思想汇报
2014/10/09 职场文书