<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript學習筆記之函數記憶

        來源:懂視網 責編:小OO 時間:2020-11-27 20:04:50
        文檔

        JavaScript學習筆記之函數記憶

        本文講解函數記憶與菲波那切數列的實現,分享給大家,具體如下:定義;函數記憶是指將上次的計算結果緩存起來,當下次調用時,如果遇到相同的參數,就直接返回緩存中的數據。舉個例子。原理;實現這樣一個 memorize 函數很簡單,原理上只用把參數和對應的結果數據存到一個對象中,調用時,判斷參數對應的數據是否存在,存在就返回對應的結果數據。第一版;我們來寫一版。我們來測試一下。在 Chrome 中,使用 memorize 大約耗時 60ms,如果不使用函數記憶,大約耗時 1.3 ms 左右。注意;什么,我們使用了看似高大上的函數記憶,結果卻更加耗時,這個例子近乎有 60 倍呢。所以,函數記憶也并不是萬能的,你看這個簡單的場景,其實并不適合用函數記憶。
        推薦度:
        導讀本文講解函數記憶與菲波那切數列的實現,分享給大家,具體如下:定義;函數記憶是指將上次的計算結果緩存起來,當下次調用時,如果遇到相同的參數,就直接返回緩存中的數據。舉個例子。原理;實現這樣一個 memorize 函數很簡單,原理上只用把參數和對應的結果數據存到一個對象中,調用時,判斷參數對應的數據是否存在,存在就返回對應的結果數據。第一版;我們來寫一版。我們來測試一下。在 Chrome 中,使用 memorize 大約耗時 60ms,如果不使用函數記憶,大約耗時 1.3 ms 左右。注意;什么,我們使用了看似高大上的函數記憶,結果卻更加耗時,這個例子近乎有 60 倍呢。所以,函數記憶也并不是萬能的,你看這個簡單的場景,其實并不適合用函數記憶。

        這篇文章主要介紹了JavaScript學習筆記之函數記憶,小編覺得挺不錯的,現在分享JavaScript源碼給大家,也給大家做個參考。對JavaScript感興趣的一起跟隨小編過來看看吧

        本文講解函數記憶與菲波那切數列的實現,分享給大家,具體如下

        定義

        函數記憶是指將上次的計算結果緩存起來,當下次調用時,如果遇到相同的參數,就直接返回緩存中的數據。

        舉個例子:

        原理

        實現這樣一個 memorize 函數很簡單,原理上只用把參數和對應的結果數據存到一個對象中,調用時,判斷參數對應的數據是否存在,存在就返回對應的結果數據。

        第一版

        我們來寫一版:

        我們來測試一下:

        在 Chrome 中,使用 memorize 大約耗時 60ms,如果我們不使用函數記憶,大約耗時 1.3 ms 左右。

        注意

        什么,我們使用了看似高大上的函數記憶,結果卻更加耗時,這個例子近乎有 60 倍呢!

        所以,函數記憶也并不是萬能的,你看這個簡單的場景,其實并不適合用函數記憶。

        需要注意的是,函數記憶只是一種編程技巧,本質上是犧牲算法的空間復雜度以換取更優的時間復雜度,在客戶端 JavaScript 中代碼的執行時間復雜度往往成為瓶頸,因此在大多數場景下,這種犧牲空間換取時間的做法以提升程序執行效率的做法是非常可取的。

        第二版

        因為第一版使用了 join 方法,我們很容易想到當參數是對象的時候,就會自動調用 toString 方法轉換成 [Object object],再拼接字符串作為 key 值。我們寫個 demo 驗證一下這個問題:

        兩者都返回了 1,顯然是有問題的,所以我們看看 underscore 的 memoize 函數是如何實現的:

        從這個實現可以看出,underscore 默認使用 function 的第一個參數作為 key,所以如果直接使用

        肯定是有問題的,如果要支持多參數,我們就需要傳入 hasher 函數,自定義存儲的 key 值。所以我們考慮使用 JSON.stringify:

        如果使用 JSON.stringify,參數是對象的問題也可以得到解決,因為存儲的是對象序列化后的字符串。

        適用場景

        我們以斐波那契數列為例:

        我們會發現最后的 count 數為 453,也就是說 fibonacci 函數被調用了 453 次!也許你會想,我只是循環到了 10,為什么就被調用了這么多次,所以我們來具體分析下:

        當執行 fib(0) 時,調用 1 次

        當執行 fib(1) 時,調用 1 次

        當執行 fib(2) 時,相當于 fib(1) + fib(0) 加上 fib(2) 本身這一次,共 1 + 1 + 1 = 3 次

        當執行 fib(3) 時,相當于 fib(2) + fib(1) 加上 fib(3) 本身這一次,共 3 + 1 + 1 = 5 次

        當執行 fib(4) 時,相當于 fib(3) + fib(2) 加上 fib(4) 本身這一次,共 5 + 3 + 1 = 9 次

        當執行 fib(5) 時,相當于 fib(4) + fib(3) 加上 fib(5) 本身這一次,共 9 + 5 + 1 = 15 次

        當執行 fib(6) 時,相當于 fib(5) + fib(4) 加上 fib(6) 本身這一次,共 15 + 9 + 1 = 25 次

        當執行 fib(7) 時,相當于 fib(6) + fib(5) 加上 fib(7) 本身這一次,共 25 + 15 + 1 = 41 次

        當執行 fib(8) 時,相當于 fib(7) + fib(6) 加上 fib(8) 本身這一次,共 41 + 25 + 1 = 67 次

        當執行 fib(9) 時,相當于 fib(8) + fib(7) 加上 fib(9) 本身這一次,共 67 + 41 + 1 = 109 次

        當執行 fib(10) 時,相當于 fib(9) + fib(8) 加上 fib(10) 本身這一次,共 109 + 67 + 1 = 177 次
        所以執行的總次數為:177 + 109 + 67 + 41 + 25 + 15 + 9 + 5 + 3 + 1 + 1 = 453 次!

        如果我們使用函數記憶呢?

        我們會發現最后的總次數為 12 次,因為使用了函數記憶,調用次數從 453 次降低為了 12 次!

        興奮的同時不要忘記思考:為什么會是 12 次呢?

        從 0 到 10 的結果各儲存一遍,應該是 11 次吶?咦,那多出來的一次是從哪里來的?

        所以我們還需要認真看下我們的寫法,在我們的寫法中,其實我們用生成的 fibonacci 函數覆蓋了原本了 fibonacci 函數,當我們執行 fibonacci(0) 時,執行一次函數,cache 為 {0: 0},但是當我們執行 fibonacci(2) 的時候,執行 fibonacci(1) + fibonacci(0),因為 fibonacci(0) 的值為 0, !cache[address] 的結果為 true,又會執行一次 fibonacci 函數。原來,多出來的那一次是在這里!

        也許你會覺得在日常開發中又用不到 fibonacci,這個例子感覺實用價值不高吶,其實,這個例子是用來表明一種使用的場景,也就是如果需要大量重復的計算,或者大量計算又依賴于之前的結果,便可以考慮使用函數記憶。而這種場景,當你遇到的時候,你就會知道的。

        相關推薦:

        JavaScript函數綁定用法解析

        javascript函數的節流throttle與防抖debounce詳解

        實例講解JavaScript函數綁定用法

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript學習筆記之函數記憶

        本文講解函數記憶與菲波那切數列的實現,分享給大家,具體如下:定義;函數記憶是指將上次的計算結果緩存起來,當下次調用時,如果遇到相同的參數,就直接返回緩存中的數據。舉個例子。原理;實現這樣一個 memorize 函數很簡單,原理上只用把參數和對應的結果數據存到一個對象中,調用時,判斷參數對應的數據是否存在,存在就返回對應的結果數據。第一版;我們來寫一版。我們來測試一下。在 Chrome 中,使用 memorize 大約耗時 60ms,如果不使用函數記憶,大約耗時 1.3 ms 左右。注意;什么,我們使用了看似高大上的函數記憶,結果卻更加耗時,這個例子近乎有 60 倍呢。所以,函數記憶也并不是萬能的,你看這個簡單的場景,其實并不適合用函數記憶。
        推薦度:
        標簽: js 記憶 函數
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: eeuss影院免费直达入口| 国产av无码专区亚洲av果冻传媒| 一本大道一卡二大卡三卡免费 | 免费福利资源站在线视频| a级毛片在线免费| a级亚洲片精品久久久久久久| 国产偷国产偷亚洲高清人| 伊人久久大香线蕉免费视频| 久久精品国产精品亚洲下载 | 成人免费无码大片a毛片软件| 亚洲AV蜜桃永久无码精品| 亚洲好看的理论片电影| 国产成人精品免费久久久久| 亚洲AV无码一区二区三区DV| 香港a毛片免费观看| 亚洲精品韩国美女在线| 91精品免费观看| 浮力影院亚洲国产第一页| 久久国产乱子伦精品免费午夜| 亚洲中文字幕无码久久综合网| 三年片在线观看免费| 337p日本欧洲亚洲大胆艺术| 国产精品免费网站| 亚洲AV无码一区二区乱子伦| 国产羞羞的视频在线观看免费| 亚洲人成电影在线天堂| 亚洲欧洲免费无码| 免费观看四虎精品成人| 亚洲国产精品无码专区影院 | 香蕉视频在线免费看| 亚洲福利视频导航| 久久久久久国产精品免费免费| 久久久亚洲精品视频| 国产免费丝袜调教视频| 亚洲精品国产摄像头| 女人被男人桶得好爽免费视频| 亚洲av日韩av无码| 成年性羞羞视频免费观看无限| 女bbbbxxxx另类亚洲| 亚洲国产精品久久久天堂| a拍拍男女免费看全片|