当前位置:主页 > javascript教程 > 详解JS函数stack size计算方法

深入理解JS函数stack size计算方法

发布:2020-02-19 19:21:35 135


为找教程的网友们整理了javascript相关的编程文章,网友厍乐池根据主题投稿了本篇教程内容,涉及到JS、stack、size、详解JS函数stack size计算方法相关内容,已被538网友关注,相关难点技巧可以阅读下方的电子资料。

详解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 DOM节点获取方法代码

    发布:2019-08-03

    下面小编就为大家带来一篇老生常谈javascript DOM节点获取。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • 如何使用vue.js国际化 vue-i18n插件

    发布:2020-01-13

    本篇文章主要介绍了vue.js国际化 vue-i18n插件的使用详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • JS中‘hello’与new String(‘hello’)引出的问题

    发布:2020-02-20

    这篇文章主要给大家介绍了关于JS中'hello'与new String('hello')引出的问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧


  • JSON格式化输出示例效果

    发布:2020-02-01

    本文主要是记录一个项目中用到的对输出的json进行格式化的小技巧,也是看到一位朋友分享的,这里mark一下,有需要的小伙伴也可以参考下。


  • Android autojs随时翻译剪贴板单词实现示例

    发布:2023-03-05

    这篇文章主要为大家介绍了Android autojs随时翻译剪贴板单词,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • 详解java 中Spring jsonp 跨域请求的实例

    详解java 中Spring jsonp 跨域请求的实例

    发布:2022-10-20

    为网友们分享了关于java的教程,这篇文章主要介绍了详解java 中Spring jsonp 跨域请求的实例的相关资料,jsonp 可用于解决主流浏览器的跨域数据访问的问题,需要的朋友可以参考下


  • 使用Python处理json字符串中的非法双引号问题

    发布:2023-04-15

    这篇文章主要介绍了使用Python处理json字符串中的非法双引号问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • javascript实现导航栏分页的代码示例

    发布:2021-06-12

    这篇文章主要为大家详细介绍了javascript实现导航栏分页效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


网友讨论