详解JS函数stack size计算方法


Posted in Javascript onJune 18, 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中实现标签切换效果的代码
Mar 01 Javascript
精通Javascript系列之数值计算
Jun 07 Javascript
AngularJS控制器继承自另一控制器
May 09 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
Jun 14 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
Jun 26 Javascript
AngularJS基础 ng-submit 指令简单示例
Aug 03 Javascript
jQuery EasyUI常用数据验证汇总
Sep 18 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
Apr 18 Javascript
实例讲解vue源码架构
Jan 24 Javascript
JS实现随机抽取三人
Nov 06 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
Oct 30 Javascript
JavaScript实现表单验证功能
Dec 09 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 #jQuery
node.js自动上传ftp的脚本分享
Jun 16 #Javascript
Vue中props的使用详解
Jun 15 #Javascript
基于jQuery实现的设置文本区域的光标位置
Jun 15 #jQuery
深入浅析Vue全局组件与局部组件的区别
Jun 15 #Javascript
react-native android状态栏的实现
Jun 15 #Javascript
JS实现监控微信小程序的原理
Jun 15 #Javascript
You might like
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
动态生成gif格式的图像要注意?
2006/10/09 PHP
php导出CSV抽象类实例
2014/09/24 PHP
PHP会话控制:Session与Cookie详解
2014/09/27 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
基于jquery1.4.2的仿flash超炫焦点图播放效果
2010/04/20 Javascript
由JavaScript技术实现的web小游戏(不含网游)
2010/06/12 Javascript
JS定时器实例
2013/04/17 Javascript
AngularJS基础学习笔记之表达式
2015/05/10 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
javascript数组去重小结
2016/03/07 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
Vue2 轮播图slide组件实例代码
2018/05/31 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
Selenium使用Chrome模拟手机浏览器方法解析
2020/04/10 Python
python中pivot()函数基础知识点
2021/01/03 Python
木马的传播途径主要有哪些
2016/04/08 面试题
关于礼仪的演讲稿
2014/01/04 职场文书
幼儿教师思想汇报
2014/01/10 职场文书
一年级数学教学反思
2014/02/01 职场文书
家庭贫困证明
2014/09/23 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers
java中如何截取字符串最后一位
2022/07/07 Java/Android
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers