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();
 };
}());

相关文章

  • javascript function、指针及内置对象

    javascript function、指针及内置对象

    该文摘自于匿名教程总结,希望对初学js的同学有帮助,因为它解决了我学习js的众多迷惑。。。
    2009-02-02
  • 如何实现从照片中裁切自已的肖像呢?

    如何实现从照片中裁切自已的肖像呢?

    如何实现从照片中裁切自已的肖像呢?...
    2007-03-03
  • 创建一个类Person的简单实例

    创建一个类Person的简单实例

    如何创建一个类Person?下面小编就为大家带来一篇创建一个类Person的简单实例。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2016-05-05
  • 详解JavaScript中的强制类型转换

    详解JavaScript中的强制类型转换

    这篇文章主要介绍了JavaScript中的强制类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • js简单正则验证汉字英文及下划线的方法

    js简单正则验证汉字英文及下划线的方法

    这篇文章主要介绍了js简单正则验证汉字英文及下划线的方法,结合完整实例形式分析了javascript针对中英文字母与下划线的正则验证方法,需要的朋友可以参考下
    2016-11-11
  • JavaScript在web自动化测试中的作用示例详解

    JavaScript在web自动化测试中的作用示例详解

    这篇文章主要给大家介绍了关于JavaScript在web自动化测试中的作用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用JavaScript具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 详解JavaScript的Symbol类型、隐藏属性、全局注册表

    详解JavaScript的Symbol类型、隐藏属性、全局注册表

    这篇文章主要介绍了JavaScript的Symbol类型、隐藏属性、全局注册表,本文主要对其使用方法和使用场景做个简单的介绍,需要的朋友可以参考下
    2022-05-05
  • JavaScript中实现块作用域的方法

    JavaScript中实现块作用域的方法

    在Javascript中由于没有作用域的概念,所以很容易发生标识符名称的冲突,尤其是在比较大的项目中,这类情况更容易发生
    2010-04-04
  • JS从非数组对象转数组的方法小结

    JS从非数组对象转数组的方法小结

    这篇文章主要给大家介绍了关于JS从非数组对象转数组的一些方法,分别是Array.prototype.slice.call(obj)、Array.from(obj)、[…obj]和Object.values(obj)等方法的详细实现方法,需要的朋友可以参考下。
    2018-03-03
  • Stop SQL Server

    Stop SQL Server

    Stop SQL Server...
    2007-06-06

最新评论