您好,登錄后才能下訂單哦!
為了保證可讀性,本文采用意譯而非直譯。另外,本文版權(quán)歸原作者所有,翻譯僅用于學(xué)習(xí)。
如果你寫了一個一直調(diào)用自身的死循環(huán),那么恭喜你,很快就可以看到報錯:Uncaught RangeError: Maximum call stack size exceeded。那么這個call stack size有多少呢?
1. 計算方法
如下的方法可以為你計算出你使用的JavaScript引擎可以支持多深的調(diào)用(由Ben Alman的一段代碼獲得靈感):
function computeMaxCallStackSize() { try { return 1 + computeMaxCallStackSize(); } catch (e) { // Call stack overflow return 1; } }
運行得到如下三個結(jié)果:
這些數(shù)字代表了什么呢?Mr.Aleph告訴我在V8,可調(diào)用的層數(shù)基于兩個方面:1. 棧的大??;2. 每一棧幀的大小(用于記錄函數(shù)參數(shù)和局部變量)。你可以在computeMaxCallStackSize聲明局部變量來測試,你會發(fā)現(xiàn)數(shù)字變小。
2. ECMAScript 6中尾遞歸優(yōu)化
ECMAScript 6支持尾遞歸優(yōu)化:如果一個函數(shù)的最后一個操作是函數(shù)調(diào)用,那么將會用“跳轉(zhuǎn)”而不是“子調(diào)用”。也就是說如果你將computeMaxCallStackSize重寫成如下形式,在ES6的嚴(yán)格模式下,就會一直運行了。
function computeMaxCallStackSize(size) { size = size || 1; return computeMaxCallStackSize(size + 1); }
3. 亮點評論
var computeMaxCallStackSize = (function() { return function() { var size = 0; function cs() { try { size++; return cs(); } catch(e) { return size + 1; } } return cs(); }; }());
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。