JS的函数调用栈stack size的计算方法

 更新时间:2018年06月24日 11:23:14   投稿:laozhang  
本篇文章给大家分享了关于JS的函数调用栈stack size的计算方法的相关知识点,有兴趣的朋友参考学习下。

如果你写了一个一直调用自身的死循环,那么恭喜你,很快就可以看到报错: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();
 };
}());

相关文章

  • js中日期的加减法

    js中日期的加减法

    JavaScript实现日期加减计算功能代码实例,因为在js中没有类似C#中的AddDays方法,所以要想实现日期加减的话,就需要自己写函数来实现。
    2015-05-05
  • 阻止移动端touchmove与scroll事件冲突技巧

    阻止移动端touchmove与scroll事件冲突技巧

    这篇文章主要为大家介绍了阻止移动端touchmove与scroll事件冲突技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 微信小程序+mqtt,esp8266温湿度读取的实现方法

    微信小程序+mqtt,esp8266温湿度读取的实现方法

    这篇文章主要介绍了微信小程序+mqtt,esp8266温湿度读取的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • js中prototype用法详细介绍

    js中prototype用法详细介绍

    这篇文章详细介绍了js中prototype用法及实例,有需要的朋友可以参考一下
    2013-11-11
  • 可浮动QQ在线客服

    可浮动QQ在线客服

    比较漂亮的qq在线客服代码,推荐使用
    2008-10-10
  • leaflet加载geojson叠加显示功能代码

    leaflet加载geojson叠加显示功能代码

    这篇文章主要介绍了leaflet加载geojson叠加显示功能代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 深入理解基于vue-cli的webpack打包优化实践及探索

    深入理解基于vue-cli的webpack打包优化实践及探索

    这篇文章主要介绍了基于vue-cli的webpack打包优化实践及探索,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • JavaScript原型链及常见的继承方法

    JavaScript原型链及常见的继承方法

    这篇文章主要介绍了JavaScript原型链及常见的继承方法,文章围绕主题展开详细的内容介绍,具有一定的的参考价值,需要的朋友可以参考一下
    2022-07-07
  • JS promise解决异步问题过程详解

    JS promise解决异步问题过程详解

    Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息
    2023-04-04
  • JavaScript 封装Ajax传递的数据代码

    JavaScript 封装Ajax传递的数据代码

    在使用Ajax传输数据时,少不了对传递的字符进行转码,我的实现方式是将需要传递的数据暂存到一js Bean中,将js Bean放到Array中,生成传输参数时对Array中的jsBean进行分解,得到相应属性信息并编码..
    2009-06-06

最新评论