国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS 利用高階函數實現函數緩存(備忘模式)

hightopo / 1496人閱讀

摘要:所以這里可以利用高階函數的思想來實現一個簡單的緩存,我可以在函數內部用一個對象存儲輸入的參數,如果下次再輸入相同的參數,那就比較一下對象的屬性,把值從這個對象里面取出來。

1. 高階函數

高階函數就是那種輸入參數里面有一個或者多個函數,輸出也是函數的函數,這個在js里面主要是利用閉包實現的,最簡單的就是經常看到的在一個函數內部輸出另一個函數,比如

var test = function() {
    return function() {}
}

這個主要是利用閉包來保持著作用域:

var add = function() {
    var num = 0;
    return function(a) {
        return num = num + a;
    }
}
add()(1);      // 1
add()(2);      // 2

這里的兩個add()(1)和add()(2)不會互相影響,可以理解為每次運行add函數后返回的都是不同的匿名函數,就是每次add運行后return的function其實都是不同的,所以運行結果也是不會影響的。

如果換一種寫法,比如:

var add = function() {
    var num = 0;
    return function(a) {
        return num = num + a;
    }
}
var adder = add();
adder(1); // 1
adder(2); // 3

這樣的話就會在之前運算結果基礎上繼續運算,意思就是這兩個 adder 運行的時候都是調用的同一個 num

2. 高階函數實現緩存(備忘模式)

比如有個函數:

var add = function(a) {
    return a + 1;
}

每次運行add(1)的時候都會輸出2,但是輸入1每次還是會計算一下1+1,如果是開銷很大的操作的話就比較消耗性能了,這里其實可以對這個計算進行一次緩存。
所以這里可以利用高階函數的思想來實現一個簡單的緩存,我可以在函數內部用一個對象存儲輸入的參數,如果下次再輸入相同的參數,那就比較一下對象的屬性,把值從這個對象里面取出來。

const memorize = function(fn) {
  const cache = {}
  return function(...args) {
    const _args = JSON.stringify(args)
    return cache[_args] || (cache[_args] = fn.apply(fn, args))
  }
}
const add = function(a) {
  return a + 1
}
const adder = memorize(add)
adder(1)    // 2    cache: { "[1]": 2 }
adder(1)    // 2    cache: { "[1]": 2 }
adder(2)    // 3    cache: { "[1]": 2, "[2]": 3 }

JSON.stringify把傳給 adder 函數的參數變成了字符串,并且把它當做 cache 的 key,將 add 函數運行的結果當做 value 傳到了 cache 里面,這樣 memorize 的匿名函數運行的時候會返回cache[_args],如果cache[_args]不存在的話就返回fn.apply(fn,args),把fn.apply(fn, arguments)賦值給cache[_args]并返回。
注意:cache不可以是Map,因為Map的鍵是使用===比較的,[1]!==[1],因此即使傳入相同的對象或者數組,那么還是被存為不同的鍵。

const memorize = function(fn) {        //  X 錯誤示范
  const cache = new Map()
  return function(...args) {
    return cache.get(args) || cache.set(args, fn.apply(fn, args)).get(args)
  }
}
const add = function(a) {
  return a + 1
}
const adder = memorize(add)
adder(1)    // 2    cache: { [ 1 ] => 2 }
adder(1)    // 2    cache: { [ 1 ] => 2, [ 1 ] => 2 }
adder(2)    // 3    cache: { [ 1 ] => 2, [ 1 ] => 2, [ 2 ] => 3 }

本文是系列文章,可以相互參考印證,共同進步~

JS 抽象工廠模式

JS 工廠模式

JS 建造者模式

JS 原型模式

JS 單例模式

JS 回調模式

JS 外觀模式

JS 適配器模式

JS 利用高階函數實現函數緩存(備忘模式)

JS 狀態模式

JS 橋接模式

JS 觀察者模式

網上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結,如果發現錯誤,歡迎留言指出~

參考: P78

PS:歡迎大家關注我的公眾號【前端下午茶】,一起加油吧~

另外可以加入「前端下午茶交流群」微信群,長按識別下面二維碼即可加我好友,備注加群,我拉你入群~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92269.html

相關文章

  • JS 原型模式

    摘要:你可以使用像下面這樣的代碼為上面的例子來實現車輛模具是福特總結原型模式在里的使用簡直是無處不在,其它很多模式有很多也是基于的,這里大家要注意的依然是淺拷貝和深拷貝的問題,免得出現引用問題。 1. 簡介 原型模式(Prototype pattern),用原型實例指向創建對象的類,使用于創建新的對象的類的共享原型的屬性與方法。 2. 實現 對于原型模式,我們可以利用JavaScript特有...

    Coding01 評論0 收藏0
  • JS 橋接模式

    摘要:簡介橋接模式將抽象部分與它的實現部分分離,使它們都可以獨立地變化。同時橋接模式也有自己的缺點大量的類將導致開發成本的增加,同時在性能方面可能也會有所減少。 1. 簡介 橋接模式(Bridge)將抽象部分與它的實現部分分離,使它們都可以獨立地變化。其實就是函數的封裝,比如要對某個DOM元素添加color和backgroundColor,可以封裝個changeColor函數,這樣可以在多個...

    chemzqm 評論0 收藏0
  • JS 回調模式

    摘要:對這種問題的解決方法是采用回調模式。可以將節點隱藏邏輯以回調函數的方式傳遞給并委托執行檢查參數是否為可調用復雜邏輯,篩選出符合的元素那么現在回調函數可選,重構后加入回調函數參數的仍然可以像以前一樣使用,而不會破壞舊的原始代碼。 1. 回調示例 如果有個模塊 findeNodes() ,任務是找到期望的 DOM 元素并使用 hide() 處理: function findNodes() ...

    oliverhuang 評論0 收藏0
  • JS 單例模式

    摘要:但是如何在對構造函數使用操作符創建多個對象的時候僅獲取一個單例對象呢。單例的實例引用單例構造函數單例私有屬性和方法暴露出來的對象改進之前在構造函數中重寫自身會丟失所有在初始定義和重定義之間添加到其中的屬性。 1. 單例模式 單例模式 (Singleton) 的實現在于保證一個特定類只有一個實例,第二次使用同一個類創建新對象的時候,應該得到與第一次創建對象完全相同的對象。當創建一個新對象...

    姘存按 評論0 收藏0
  • JS 狀態模式

    摘要:簡介狀態模式允許一個對象在其內部狀態改變的時候改變它的行為,對象看起來似乎修改了它的類。狀態通常為一個或多個枚舉常量的表示。簡而言之,當遇到很多同級或者的時候,可以使用狀態模式來進行簡化。 1. 簡介 狀態模式(State)允許一個對象在其內部狀態改變的時候改變它的行為,對象看起來似乎修改了它的類。其實就是用一個對象或者數組記錄一組狀態,每個狀態對應一個實現,實現的時候根據狀態挨個去運...

    xingqiba 評論0 收藏0

發表評論

0條評論

hightopo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<