最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS的函數(shù)調用棧stack size的計算方法

 更新時間:2018年06月24日 11:23:14   投稿:laozhang  
本篇文章給大家分享了關于JS的函數(shù)調用棧stack size的計算方法的相關知識點,有興趣的朋友參考學習下。

如果你寫了一個一直調用自身的死循環(huán),那么恭喜你,很快就可以看到報錯: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

這些數(shù)字代表了什么呢?Mr.Aleph告訴我在V8,可調用的層數(shù)基于兩個方面:1. 棧的大??;2. 每一棧幀的大小(用于記錄函數(shù)參數(shù)和局部變量)。你可以在computeMaxCallStackSize聲明局部變量來測試,你會發(fā)現(xiàn)數(shù)字變小。

2. ECMAScript 6中尾遞歸優(yōu)化

ECMAScript 6支持尾遞歸優(yōu)化:如果一個函數(shù)的最后一個操作是函數(shù)調用,那么將會用“跳轉”而不是“子調用”。也就是說如果你將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中日期的加減法

    js中日期的加減法

    JavaScript實現(xiàn)日期加減計算功能代碼實例,因為在js中沒有類似C#中的AddDays方法,所以要想實現(xiàn)日期加減的話,就需要自己寫函數(shù)來實現(xiàn)。
    2015-05-05
  • 阻止移動端touchmove與scroll事件沖突技巧

    阻止移動端touchmove與scroll事件沖突技巧

    這篇文章主要為大家介紹了阻止移動端touchmove與scroll事件沖突技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法

    微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法

    這篇文章主要介紹了微信小程序+mqtt,esp8266溫濕度讀取的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • js中prototype用法詳細介紹

    js中prototype用法詳細介紹

    這篇文章詳細介紹了js中prototype用法及實例,有需要的朋友可以參考一下
    2013-11-11
  • 可浮動QQ在線客服

    可浮動QQ在線客服

    比較漂亮的qq在線客服代碼,推薦使用
    2008-10-10
  • leaflet加載geojson疊加顯示功能代碼

    leaflet加載geojson疊加顯示功能代碼

    這篇文章主要介紹了leaflet加載geojson疊加顯示功能代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 深入理解基于vue-cli的webpack打包優(yōu)化實踐及探索

    深入理解基于vue-cli的webpack打包優(yōu)化實踐及探索

    這篇文章主要介紹了基于vue-cli的webpack打包優(yōu)化實踐及探索,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • JavaScript原型鏈及常見的繼承方法

    JavaScript原型鏈及常見的繼承方法

    這篇文章主要介紹了JavaScript原型鏈及常見的繼承方法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的的參考價值,需要的朋友可以參考一下
    2022-07-07
  • JS promise解決異步問題過程詳解

    JS promise解決異步問題過程詳解

    Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調函數(shù)和事件——更合理和更強大。簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。從語法上說,Promise是一個對象,從它可以獲取異步操作的消息
    2023-04-04
  • JavaScript 封裝Ajax傳遞的數(shù)據(jù)代碼

    JavaScript 封裝Ajax傳遞的數(shù)據(jù)代碼

    在使用Ajax傳輸數(shù)據(jù)時,少不了對傳遞的字符進行轉碼,我的實現(xiàn)方式是將需要傳遞的數(shù)據(jù)暫存到一js Bean中,將js Bean放到Array中,生成傳輸參數(shù)時對Array中的jsBean進行分解,得到相應屬性信息并編碼..
    2009-06-06

最新評論

乐山市| 平武县| 突泉县| 新疆| 吴忠市| 马龙县| 沧州市| 监利县| 东乌| 郯城县| 林周县| 拉萨市| 铜川市| 社会| 旌德县| 康平县| 巴里| 禹城市| 宜昌市| 涟源市| 道孚县| 长汀县| 汪清县| 龙南县| 沂源县| 涟水县| 治多县| 韩城市| 个旧市| 锦屏县| 潮州市| 尚义县| 镇原县| 吉安县| 弥勒县| 建湖县| 荥经县| 镶黄旗| 黔江区| 温州市| 沙湾县|