摘要:所以這里可以利用高階函數(shù)的思想來實現(xiàn)一個簡單的緩存,我可以在函數(shù)內部用一個對象存儲輸入的參數(shù),如果下次再輸入相同的參數(shù),那就比較一下對象的屬性,把值從這個對象里面取出來。
1. 高階函數(shù)
高階函數(shù)就是那種輸入參數(shù)里面有一個或者多個函數(shù),輸出也是函數(shù)的函數(shù),這個在js里面主要是利用閉包實現(xiàn)的,最簡單的就是經??吹降脑谝粋€函數(shù)內部輸出另一個函數(shù),比如
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函數(shù)后返回的都是不同的匿名函數(shù),就是每次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
這樣的話就會在之前運算結果基礎上繼續(xù)運算,意思就是這兩個 adder 運行的時候都是調用的同一個 num
2. 高階函數(shù)實現(xiàn)緩存(備忘模式)比如有個函數(shù):
var add = function(a) { return a + 1; }
每次運行add(1)的時候都會輸出2,但是輸入1每次還是會計算一下1+1,如果是開銷很大的操作的話就比較消耗性能了,這里其實可以對這個計算進行一次緩存。
所以這里可以利用高階函數(shù)的思想來實現(xiàn)一個簡單的緩存,我可以在函數(shù)內部用一個對象存儲輸入的參數(shù),如果下次再輸入相同的參數(shù),那就比較一下對象的屬性,把值從這個對象里面取出來。
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 函數(shù)的參數(shù)變成了字符串,并且把它當做 cache 的 key,將 add 函數(shù)運行的結果當做 value 傳到了 cache 里面,這樣 memorize 的匿名函數(shù)運行的時候會返回cache[_args],如果cache[_args]不存在的話就返回fn.apply(fn,args),把fn.apply(fn, arguments)賦值給cache[_args]并返回。
注意:cache不可以是Map,因為Map的鍵是使用===比較的,[1]!==[1],因此即使傳入相同的對象或者數(shù)組,那么還是被存為不同的鍵。
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 利用高階函數(shù)實現(xiàn)函數(shù)緩存(備忘模式)
JS 狀態(tài)模式
JS 橋接模式
JS 觀察者模式
網上的帖子大多深淺不一,甚至有些前后矛盾,在下的文章都是學習過程中的總結,如果發(fā)現(xiàn)錯誤,歡迎留言指出~
參考:P78
PS:歡迎大家關注我的公眾號【前端下午茶】,一起加油吧~
另外可以加入「前端下午茶交流群」微信群,長按識別下面二維碼即可加我好友,備注加群,我拉你入群~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/92269.html
摘要:對這種問題的解決方法是采用回調模式??梢詫⒐?jié)點隱藏邏輯以回調函數(shù)的方式傳遞給并委托執(zhí)行檢查參數(shù)是否為可調用復雜邏輯,篩選出符合的元素那么現(xiàn)在回調函數(shù)可選,重構后加入回調函數(shù)參數(shù)的仍然可以像以前一樣使用,而不會破壞舊的原始代碼。 1. 回調示例 如果有個模塊 findeNodes() ,任務是找到期望的 DOM 元素并使用 hide() 處理: function findNodes() ...
摘要:簡介狀態(tài)模式允許一個對象在其內部狀態(tài)改變的時候改變它的行為,對象看起來似乎修改了它的類。狀態(tài)通常為一個或多個枚舉常量的表示。簡而言之,當遇到很多同級或者的時候,可以使用狀態(tài)模式來進行簡化。 1. 簡介 狀態(tài)模式(State)允許一個對象在其內部狀態(tài)改變的時候改變它的行為,對象看起來似乎修改了它的類。其實就是用一個對象或者數(shù)組記錄一組狀態(tài),每個狀態(tài)對應一個實現(xiàn),實現(xiàn)的時候根據狀態(tài)挨個去運...
閱讀 1059·2021-11-15 18:06
閱讀 2416·2021-10-08 10:04
閱讀 2714·2019-08-28 18:03
閱讀 953·2019-08-26 13:42
閱讀 1980·2019-08-26 11:31
閱讀 2489·2019-08-23 17:13
閱讀 989·2019-08-23 16:45
閱讀 2139·2019-08-23 14:11