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 相关文章推荐
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
Javascript连接多个数组不用concat来解决
Mar 24 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
jQuery仿gmail实现fixed布局的方法
May 27 Javascript
jQuery使用$.ajax进行即时验证实例详解
Dec 11 Javascript
livereload工具实现前端可视化开发【推荐】
Dec 23 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
json数据格式常见操作示例
Jun 13 Javascript
vue.js实现图书管理功能
Sep 24 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
Oct 28 Javascript
JavaScript实现省份城市的三级联动
Feb 11 Javascript
vue css 相对路径导入问题级踩坑记录
Jun 05 Vue.js
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中随机显示图片的函数代码
2011/06/23 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
js获取url中"?"后面的字串方法
2014/05/15 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
获取JS中网页各种高宽与位置的方法总结
2016/07/27 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
Vue 重置组件到初始状态的方法示例
2018/10/10 Javascript
解决ie11 SCRIPT5011:不能执行已释放Script的代码问题
2019/05/05 Javascript
TypeScript类型声明书写详解
2019/08/28 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
理解Python垃圾回收机制
2016/02/12 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python增加矩阵维度的实例讲解
2018/04/04 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
开门红主持词
2014/04/02 职场文书
质量承诺书怎么写
2014/05/24 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
学校食品安全责任书
2015/01/29 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
硕士毕业答辩开场白
2015/05/27 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
mysql死锁和分库分表问题详解
2021/04/16 MySQL
CSS 还能这样玩?奇思妙想渐变的艺术
2021/04/27 HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS