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 相关文章推荐
利用js判断浏览器类型(是否为IE,Firefox,Opera浏览器)
Nov 22 Javascript
js中数组(Array)的排序(sort)注意事项说明
Jan 24 Javascript
extjs 分页使用jsp传递数据示例
Jul 29 Javascript
详解JavaScript中的表单验证
Jun 16 Javascript
jquery实现叠层3D文字特效代码分享
Aug 21 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
Aug 22 Javascript
Jquery实现仿京东商城省市联动菜单
Nov 19 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
Jan 13 Javascript
less简单入门(CSS 预处理语言)
Mar 08 Javascript
JavaScript原型继承_动力节点Java学院整理
Jun 30 Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
Apr 18 jQuery
node将geojson转shp返回给前端的实现方法
May 29 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实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
dojo 之基础篇
2007/03/24 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
javascript 回调函数详解
2014/11/11 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
[05:31]DOTA2英雄梦之声_第04期_光之守卫
2014/06/23 DOTA
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python数据结构与算法之图的基本实现及迭代器实例详解
2017/12/12 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
对Python生成器、装饰器、递归的使用详解
2019/07/19 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
numpy实现RNN原理实现
2021/03/02 Python
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
应届生学校辅导员求职信
2013/11/07 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
教师师德师风整改措施
2014/10/24 职场文书
导游欢迎词范文
2015/01/23 职场文书
会计人员岗位职责
2015/02/03 职场文书
会计工作岗位职责
2015/02/03 职场文书
医院志愿者活动总结
2015/05/06 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL