欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年06月24日 11:23:14   投稿:laozhang  
本篇文章給大家分享了關(guān)于JS的函數(shù)調(diào)用棧stack size的計算方法的相關(guā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é)果:

  • 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的嚴(yán)格模式下,就會一直運行了。

function computeMaxCallStackSize(size) {
    size = size || 1;
    return computeMaxCallStackSize(size + 1);
  }

3. 亮點評論

Andrei: “ECMAScript 6”版本的代碼根本跑不通。雖然size會被更改,但是最終并沒有值返回。

回復(fù)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();
 };
}());

相關(guān)文章

  • JavaScript中arguments的使用方法

    JavaScript中arguments的使用方法

    這篇文章主要介紹了JavaScript中arguments的使用方法,arguments?是一個對應(yīng)于傳遞給函數(shù)的參數(shù)的類數(shù)組對象。下文詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • JavaScript中的return語句簡單介紹

    JavaScript中的return語句簡單介紹

    return語句在js中起到舉足輕重的作用,該關(guān)鍵字不僅具有返回函數(shù)值得功能,還具有一些特殊的用法,有個清晰的把握是非常有必要的,下面通過本篇文章給大家簡單介紹下return語句的作用
    2015-12-12
  • 兩種JavaScript的AES加密方式(可與Java相互加解密)

    兩種JavaScript的AES加密方式(可與Java相互加解密)

    這篇文章主要介紹了兩種JavaScript的AES加密方式(可與Java相互加解密) 的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • 小程序中英文混合排序問題解決

    小程序中英文混合排序問題解決

    這篇文章主要介紹了小程序中英文混合排序問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • 微信小程序緩存過期時間的使用詳情

    微信小程序緩存過期時間的使用詳情

    這篇文章主要介紹了微信小程序緩存過期時間的使用詳情,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 簡單談?wù)刧ulp-changed插件

    簡單談?wù)刧ulp-changed插件

    這篇文章主要介紹了關(guān)于gulp-changed插件的相關(guān)資料,文中介紹的還是相對詳細(xì)的,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • jquery操作下拉列表、文本框、復(fù)選框、單選框集合(收藏)

    jquery操作下拉列表、文本框、復(fù)選框、單選框集合(收藏)

    jquery操作拉列表、文本框、復(fù)選框、單選框集合。各種對下拉列表、文本框、復(fù)選框、單選框的jquery的相關(guān)操作。做為記錄和收藏的最好方法
    2014-01-01
  • js中addEventListener()與removeEventListener()用法案例分析

    js中addEventListener()與removeEventListener()用法案例分析

    這篇文章主要介紹了js中addEventListener()與removeEventListener()用法,結(jié)合實例形式分析了js中addEventListener()與removeEventListener()基本功能、用法與操作注意事項,需要的朋友可以參考下
    2020-03-03
  • JS實現(xiàn)1000以內(nèi)被3或5整除的數(shù)字之和

    JS實現(xiàn)1000以內(nèi)被3或5整除的數(shù)字之和

    今天在技術(shù)群里看到一道這樣的提:求1000以內(nèi)被3或5整除的數(shù)字之和。小編把我的解決辦法分享到腳本之家平臺,供大家參考
    2016-02-02
  • js選項卡的實現(xiàn)方法

    js選項卡的實現(xiàn)方法

    這篇文章主要介紹了js選項卡的實現(xiàn)方法,實例分析了js選項卡的實現(xiàn)思路及html+css布局與js功能技巧,非常具有實用價值,需要的朋友可以參考下
    2015-02-02

最新評論