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版
Nov 05 Javascript
JavaScript中判断数据类型的方法总结
May 24 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
Jul 24 Javascript
AngularJS基础 ng-csp 指令详解
Aug 01 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
Jan 23 Javascript
JS原生轮播图的简单实现(推荐)
Jul 22 Javascript
Vue中自定义全局组件的实现方法
Dec 08 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
Jun 27 Javascript
vue与django集成打包的实现方法
Nov 11 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
Apr 10 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
Apr 26 Javascript
jQuery+ajax实现文件上传功能
Dec 22 jQuery
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日历制作代码分享
2014/01/20 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
使用php-timeit估计php函数的执行时间
2015/09/06 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
js技巧--转义符"\"的妙用
2007/01/09 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
Vue2单一事件管理组件通信
2017/05/09 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
python实现读取命令行参数的方法
2015/05/22 Python
python+VTK环境搭建及第一个简单程序代码
2017/12/13 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Flask配置Cors跨域的实现
2019/07/12 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
Python执行时间的几种计算方法
2020/07/31 Python
销售人员工作自我评价
2014/09/21 职场文书
房产协议书范本
2014/10/18 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
python基础之匿名函数详解
2021/04/21 Python
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python