摘要:中尾遞歸優化支持尾遞歸優化如果一個函數的最后一個操作是函數調用,那么將會用跳轉而不是子調用。自從年雙十一正式上線,累計處理了億錯誤事件,付費客戶有陽光保險核桃編程荔枝掌門對微脈青團社等眾多知名企業。
譯者按: 有時候會遇到Maximum call stack size exceeded的問題,本文教你stack size的計算方法。
原文: The maximum call stack size
譯者: Fundebug
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。
如果你寫了一個一直調用自身的死循環,那么恭喜你,很快就可以看到報錯: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); }
備注:justjavac提到由于尾遞歸優化會導致堆棧報錯信息不準確而逐漸不被支持,請大家移步評論區了解詳情。
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(); }; }());關于Fundebug
Fundebug專注于JavaScript、微信小程序、微信小游戲、支付寶小程序、React Native、Node.js和Java線上應用實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了10億+錯誤事件,付費客戶有陽光保險、核桃編程、荔枝FM、掌門1對1、微脈、青團社等眾多知名企業。歡迎大家免費試用!
版權聲明轉載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2018/06/15/call-stack-size/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95755.html
摘要:一鍵生成屬于自己的歷史報告,看看你對自己的了解程度有多深簡介近幾年,由于微信的流行,大部分人不再頻繁使用,所以我們對于自己的數據并不是特別了解。這里要說明的是,加密函數的獲取,需要具備一定的抓包基礎才能獲取得到。 [TOC] 一鍵生成屬于自己的QQ歷史報告,看看你對自己的QQ了解程度有多深? 簡介 近幾年,由于微信的流行,大部分人不再頻繁使用QQ,所以我們對于自己的QQ數據并不是特別了...
摘要:之前的閉包也好,自執行函數也好,都是模塊化的一些嘗試,直到規范推出之后,模塊化才真正迅猛發展起來。因為有了模塊化的概念,才有了按需加載的概念。 前言 我們來玩樂高積木吧 模塊化Js已經成為了老生常談,不過在JavaScript設計之初,由于定位的問題并沒有提供類的功能,開發者需要模擬出類似的功能,來隔離、組織復雜的JavaScript代碼。之前的閉包也好,自執行函數也好,都是模塊化的一...
摘要:之前的閉包也好,自執行函數也好,都是模塊化的一些嘗試,直到規范推出之后,模塊化才真正迅猛發展起來。因為有了模塊化的概念,才有了按需加載的概念。 前言 我們來玩樂高積木吧 模塊化Js已經成為了老生常談,不過在JavaScript設計之初,由于定位的問題并沒有提供類的功能,開發者需要模擬出類似的功能,來隔離、組織復雜的JavaScript代碼。之前的閉包也好,自執行函數也好,都是模塊化的一...
摘要:父組件聲明自己支持父組件提供一個函數,用來返回相應的對象子組件聲明自己需要使用我胡漢三又回來了點擊我如果是父組件向子組件單向通信,可以使用變量,如果子組件想向父組件通信,同樣可以由父組件提供一個回調函數,供子組件調用,回傳參數。 在使用 React 的過程中,不可避免的需要組件間進行消息傳遞(通信),組件間通信大體有下面幾種情況: 父組件向子組件通信 子組件向父組件通信 跨級組件之間...
showImg(https://segmentfault.com/img/bVbsRlD?w=211&h=184); 今天是520。一句溫柔的問候,一束美麗的鮮花,一段真情的告白。但是作為一名與眾不同的程序員,我們可不僅僅擁有上面的傳情方法,別忘了每個人的手上可是都有其他人不具備的神奇技能,就是我們每天辛辛苦苦敲下的代碼。 在這個特殊的日子,就用我們手中的魔法代碼,來給你的她(他)制作出一個與眾不...
閱讀 1293·2021-11-16 11:44
閱讀 3758·2021-10-09 10:01
閱讀 1745·2021-09-24 10:31
閱讀 3833·2021-09-04 16:41
閱讀 2510·2021-08-09 13:45
閱讀 1210·2019-08-30 14:08
閱讀 1775·2019-08-29 18:32
閱讀 1640·2019-08-26 12:12