详解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 相关文章推荐
splice slice区别
Oct 09 Javascript
javascript引用对象的方法代码
Aug 13 Javascript
[推荐]javascript 面向对象技术基础教程
Mar 03 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
May 17 Javascript
JS应用正则表达式转换大小写示例
Sep 18 Javascript
JavaScript DOM进阶方法
Apr 13 Javascript
JS+CSS实现下拉列表框美化效果(3款)
Aug 15 Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 Javascript
vue双向绑定简要分析
Mar 23 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
微信小程序使用template标签实现五星评分功能
Nov 03 Javascript
JavaScript函数式编程(Functional Programming)声明式与命令式实例分析
May 21 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
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
Jquery中val()表单取值赋值的实例代码
2013/08/15 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
关于Bootstrap按钮组件消除黄框的方法
2017/05/19 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
vue cli webpack中使用sass的方法
2018/02/24 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python动态加载包的方法小结
2016/04/18 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python编写打字训练小程序
2019/09/26 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
COSETTE官网:奢华,每天
2020/03/22 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
JVM是一个编译程序还是解释程序
2012/09/11 面试题
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
四风自我剖析材料
2014/09/30 职场文书
学校机关党总支领导班子整改工作方案
2014/10/26 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
档案工作个人总结
2015/03/03 职场文书
同学聚会祝酒词
2015/08/10 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL