首頁  >  文章  >  web前端  >  關於JS的函數呼叫堆疊stack size的計算方法

關於JS的函數呼叫堆疊stack size的計算方法

不言
不言原創
2018-06-29 10:35:532641瀏覽

這篇文章跟大家分享了關於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();
 };
}());

#以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

jQuery實作取得動態新增的標籤物件

#微信小程式如何取得javascript 裡的數據

如何透過JS判斷iframe是否載入完成

以上是關於JS的函數呼叫堆疊stack size的計算方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn