這篇文章跟大家分享了關於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; } }
執行得到以下三個結果:
2. ECMAScript 6中尾遞歸最佳化
ECMAScript 6支援尾遞歸最佳化:如果一個函數的最後一個操作是函數調用,那麼將會用「跳轉”而不是“子調用”。也就是說如果你將computeMaxCallStackSize改寫成如下形式,在ES6的嚴格模式下,就會一直運作了。function computeMaxCallStackSize(size) { size = size || 1; return computeMaxCallStackSize(size + 1); }
3. 亮點評論
Andrei: “ECMAScript 6”版本的程式碼根本跑不通。雖然size會被更改,但是最終並沒有值返回。var computeMaxCallStackSize = (function() { return function() { var size = 0; function cs() { try { size++; return cs(); } catch(e) { return size + 1; } } return cs(); }; }());#以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網! 相關推薦:
以上是關於JS的函數呼叫堆疊stack size的計算方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!