欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JS函數(shù)stack size計(jì)算方法

 更新時(shí)間:2018年06月18日 09:10:17   作者:Fundebug  
本篇文章給大家分享了關(guān)于JS函數(shù)中stack size計(jì)算方法的相關(guān)知識(shí)點(diǎn),對(duì)此有需要的朋友可以跟著學(xué)習(xí)下。

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。

如果你寫(xiě)了一個(gè)一直調(diào)用自身的死循環(huán),那么恭喜你,很快就可以看到報(bào)錯(cuò):Uncaught RangeError: Maximum call stack size exceeded。那么這個(gè)call stack size有多少呢?

1. 計(jì)算方法

如下的方法可以為你計(jì)算出你使用的JavaScript引擎可以支持多深的調(diào)用(由Ben Alman的一段代碼獲得靈感):

function computeMaxCallStackSize() {
    try {
      return 1 + computeMaxCallStackSize();
    } catch (e) {
      // Call stack overflow
      return 1;
    }
  }

運(yùn)行得到如下三個(gè)結(jié)果:

  • Node.js: 11034
  • Firefox: 50994
  • Chrome: 10402

這些數(shù)字代表了什么呢?Mr.Aleph告訴我在V8,可調(diào)用的層數(shù)基于兩個(gè)方面:1. 棧的大?。?. 每一棧幀的大小(用于記錄函數(shù)參數(shù)和局部變量)。你可以在computeMaxCallStackSize聲明局部變量來(lái)測(cè)試,你會(huì)發(fā)現(xiàn)數(shù)字變小。

2. ECMAScript 6中尾遞歸優(yōu)化

ECMAScript 6支持尾遞歸優(yōu)化:如果一個(gè)函數(shù)的最后一個(gè)操作是函數(shù)調(diào)用,那么將會(huì)用“跳轉(zhuǎn)”而不是“子調(diào)用”。也就是說(shuō)如果你將computeMaxCallStackSize重寫(xiě)成如下形式,在ES6的嚴(yán)格模式下,就會(huì)一直運(yùn)行了。

function computeMaxCallStackSize(size) {
    size = size || 1;
    return computeMaxCallStackSize(size + 1);
  }

3. 亮點(diǎn)評(píng)論

  • Andrei: “ECMAScript 6”版本的代碼根本跑不通。雖然size會(huì)被更改,但是最終并沒(méi)有值返回。
  • 回復(fù)Andrei: 有趣!你不能用這段代碼去計(jì)算stack size。在ES6下,這段代碼會(huì)一直運(yùn)行,因此不會(huì)返回?cái)?shù)據(jù)。在其它情況下,會(huì)返回RangeError。為了使其工作,我把代碼重寫(xiě)了一下:
var computeMaxCallStackSize = (function() {
 return function() {
  var size = 0;
  function cs() {
   try {
    size++;
    return cs();
   } catch(e) {
    return size + 1;
   }
  }
  return cs();
 };
}());

相關(guān)文章

最新評(píng)論