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 相关文章推荐
window.open()弹出居中的窗口
Feb 01 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
Nov 03 Javascript
可选择和输入的下拉列表框示例
Nov 05 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
jquery模拟alert的弹窗插件
Jul 31 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
Sep 20 Javascript
angular.bind使用心得
Oct 26 Javascript
jQuery.form插件的使用及跨域异步上传文件
Apr 27 Javascript
IScroll5 中文API参数说明和调用方法
May 21 Javascript
JS读写CSS样式的方法汇总
Aug 16 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
Apr 07 Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 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
PHP详细彻底学习Smarty
2008/03/27 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
JavaScript实现拼音排序的方法
2012/11/20 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
JavaScript中Number对象的toFixed() 方法详解
2016/09/02 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
微信小程序实现图片自适应(支持多图)
2017/01/25 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
javascript json字符串到json对象转义问题
2019/01/22 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
python中的协程深入理解
2019/06/10 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
Python字典的概念及常见应用实例详解
2019/10/30 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
开办化妆品公司创业计划书
2013/12/26 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
教师产假请假条范文
2014/04/10 职场文书
企业法人代表证明书
2014/09/27 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
2015年仓管员工作总结
2015/04/21 职场文书
祝寿主持词
2015/07/02 职场文书