国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

詳解JS函數stack size計算方法

2024-05-06 16:44:55
字體:
來源:轉載
供稿:網友

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。

如果你寫了一個一直調用自身的死循環,那么恭喜你,很快就可以看到報錯: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/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苏尼特左旗| 张家港市| 高碑店市| 明光市| 忻州市| 邢台市| 平度市| 关岭| 眉山市| 抚远县| 耒阳市| 桃源县| 神农架林区| 宜君县| 仲巴县| 左权县| 綦江县| 遵化市| 册亨县| 宁蒗| 雅江县| 皮山县| 杂多县| 沙洋县| 吐鲁番市| 嘉禾县| 长岛县| 涪陵区| 静宁县| 南部县| 武清区| 云浮市| 靖江市| 鄂伦春自治旗| 东乌珠穆沁旗| 香格里拉县| 化州市| 舒兰市| 托克逊县| 财经| 陕西省|