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 点击按钮显示和隐藏层的代码
Jul 25 Javascript
遍历DOM对象内的元素属性示例代码
Feb 08 Javascript
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
node.js中的console.warn方法使用说明
Dec 09 Javascript
简单的分页代码js实现
May 17 Javascript
jquery获取所有选中的checkbox实现代码
May 26 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
jQuery extend()详解及简单实例
May 06 jQuery
JS限制输入框输入的实现代码
Jul 02 Javascript
jQuery操作元素的内容和样式完整实例分析
Jan 10 jQuery
vue+vant使用图片预览功能ImagePreview的问题解决
Apr 10 Javascript
JS实现百度搜索框
Feb 25 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
改变javascript函数内部this指针指向的三种方法
2010/04/23 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
jquery限定文本框只能输入数字即整数和小数
2013/11/29 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
vue实现跳转接口push 转场动画示例
2019/11/01 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
儿童学习python的一些小技巧
2018/05/27 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
男女朋友协议书
2014/04/23 职场文书
2014高考励志标语
2014/06/05 职场文书
科学发展观演讲稿
2014/09/11 职场文书
单位介绍信格式
2015/01/31 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
Feign调用全局异常处理解决方案
2021/06/24 Java/Android
Python语言内置数据类型
2022/02/24 Python