詳解JS函數(shù)stack size計(jì)算方法
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(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)文章
JavaScript實(shí)現(xiàn)表格點(diǎn)擊排序的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)表格點(diǎn)擊排序的方法,可實(shí)現(xiàn)點(diǎn)擊頂部數(shù)據(jù)項(xiàng)標(biāo)題實(shí)現(xiàn)對(duì)應(yīng)數(shù)據(jù)列的排序效果,涉及javascript鼠標(biāo)事件及數(shù)據(jù)排序的技巧,需要的朋友可以參考下2015-05-05純javascript響應(yīng)式樹(shù)形菜單效果
這篇文章主要為大家分享了純javascript響應(yīng)式樹(shù)形菜單效果的簡(jiǎn)單教程,對(duì)多級(jí)目錄樹(shù)形菜單感興趣的小伙伴們可以參考一下2015-11-11JavaScript打開(kāi)word文檔的實(shí)現(xiàn)代碼(c#)
在C#中打開(kāi)word文檔其實(shí)不算太難,方法也比較多,用javascript怎么打開(kāi)呢?其實(shí),也不難2012-04-04淺談JS中String()與 .toString()的區(qū)別
下面小編就為大家?guī)?lái)一篇淺談JS中String()與 .toString()的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-10-10js中apply和Math.max()函數(shù)的問(wèn)題及區(qū)別介紹
這篇文章主要介紹了js中apply和Math.max()函數(shù)的問(wèn)題,本文給大家?guī)?lái)兩種答案,每一種答案給大家介紹的非常詳細(xì),在文章底部給大家提到了js中Math.max.apply和Math.max的區(qū)別,感興趣的朋友一起看看吧2018-03-03靜態(tài)的動(dòng)態(tài)續(xù)篇之來(lái)點(diǎn)XML
靜態(tài)的動(dòng)態(tài)續(xù)篇之來(lái)點(diǎn)XML...2006-08-08打豆豆小游戲 用javascript編寫(xiě)的[打豆豆]小游戲
用javascript 寫(xiě)了一個(gè)打豆豆的游戲,至于怎么玩的就不細(xì)說(shuō)了,到網(wǎng)上搜一下就知道了,很簡(jiǎn)單,感興趣的朋友可以了解下哦2013-01-01javascript實(shí)現(xiàn)京東登錄顯示隱藏密碼
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)京東登錄顯示隱藏密碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08