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 多级下拉菜单核心代码
May 21 Javascript
js日历功能对象
Jan 12 Javascript
Jquery解析json数据详解
Dec 26 Javascript
JS判断文本框内容改变事件的简单实例
Mar 07 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 Javascript
微信公众号菜单配置微信小程序实例详解
Mar 31 Javascript
防止页面url缓存中ajax中post请求的处理方法
Oct 10 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
使用pm2部署node生产环境的方法步骤
Mar 09 Javascript
node基于async/await对mysql进行封装
Jun 20 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
Oct 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
php.ini中date.timezone设置详解
2016/11/20 PHP
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
js读取配置文件自写
2014/02/11 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
Node.js事件驱动
2015/06/18 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
2015/11/17 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
2016/11/22 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
详解Node.js实现301、302重定向服务
2017/04/07 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
vue实例中data使用return包裹的方法
2018/08/27 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
探究Python中isalnum()方法的使用
2015/05/18 Python
python初步实现word2vec操作
2020/06/09 Python
Allsole美国/加拿大:英国一家专门出售品牌鞋子的网站
2018/10/21 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
行政助理工作职责范本
2014/03/04 职场文书
年终晚会主持词
2014/03/25 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
节约用电倡议书
2015/04/28 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
数据库连接池
2021/04/06 MySQL
Html5获取用户当前位置的几种方式
2022/01/18 HTML / CSS