小編給大家分享一下JS中函數(shù)調(diào)用棧stack size如何計算,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
方正網(wǎng)站建設公司成都創(chuàng)新互聯(lián)公司,方正網(wǎng)站設計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為方正數(shù)千家提供企業(yè)網(wǎng)站建設服務。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設要多少錢,請找那個售后服務好的方正做網(wǎng)站的公司定做!
1. 計算方法
如下的方法可以為你計算出你使用的JavaScript引擎可以支持多深的調(diào)用(由Ben Alman的一段代碼獲得靈感):
function computeMaxCallStackSize() { try { return 1 + computeMaxCallStackSize(); } catch (e) { // Call stack overflow return 1; } }
運行得到如下三個結果:
Node.js: 11034
Firefox: 50994
Chrome: 10402
這些數(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的嚴格模式下,就會一直運行了。
function computeMaxCallStackSize(size) { size = size || 1; return computeMaxCallStackSize(size + 1); }
3. 亮點評論
Andrei: “ECMAScript 6”版本的代碼根本跑不通。雖然size會被更改,但是最終并沒有值返回。
回復Andrei: 有趣!你不能用這段代碼去計算stack size。在ES6下,這段代碼會一直運行,因此不會返回數(shù)據(jù)。在其它情況下,會返回RangeError。為了使其工作,我把代碼重寫了一下:
var computeMaxCallStackSize = (function() { return function() { var size = 0; function cs() { try { size++; return cs(); } catch(e) { return size + 1; } } return cs(); }; }());
以上是“JS中函數(shù)調(diào)用棧stack size如何計算”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!