JS每日一題:函數語言程式設計中純函式如何理解?
20190313期
函數語言程式設計中純函式如何理解?
概念: 不依賴執行的上下文,也不影響上下文的變數,輸出只由輸入決定
程式碼理解一下
// 綜上,非純函式,輸入依賴外部變數 let b = 1 function unPure(a) { return a + b } // 綜上,非純函式,輸出改變外部變數 let o = {} function unPure(object) { object.ex = 1 return object } // 綜上, 純函式, 輸出輸入不影響外部變數 function pure(a) { let b = 1 return a + b }
純函式的好處
相信大家發現了,無論是概念還是程式碼理解都很簡單, 那為什麼要使用純函式呢? 下面我們羅列一下使用純函式的好處
- 可快取性
- 可移植性
- 可測試性
可快取性
純函式可以根據輸入來做快取
// 下面的程式碼我們可以發現相同的輸入,再第二次呼叫的時候都是直接取的快取 let squareNumber= memoize((x) => { return x*x; }); squareNumber(4); //=> 16 squareNumber(4); // 從快取中讀取輸入值為 4 的結果 //=> 16 squareNumber(5); //=> 25 squareNumber(5); // 從快取中讀取輸入值為 5 的結果 //=> 25
怎麼實現呢? 我們接著看下面的程式碼
const memoize = (f) => { const cache = {}; return () => { var arg_str = JSON.stringify(arguments); // 關鍵就在這裡,我們利用純函式相同輸入相同輸出的邏輯,在這裡利用cache做一個簡單的快取,當這個引數之前使用過時,我們立即返回結果就行 cache[arg_str] = cache[arg_str] || f.apply(f, arguments); return cache[arg_str]; }; };
可移植性
可移植性大白話過來就是,在任何一個地方都可以隨意使用,A專案中使用過的,B專案想要使用直接拿過來就ok的那種
程式碼再來理解一下
// 我們注意看下方有兩個註冊的函式 // 不純的, 如果B專案想要用到這個函式,很顯然我們將其依賴的其它服務給搬過去 const signUp = function(attrs) { var user = saveUser(attrs); welcomeUser(user); } // 純的, 我們再來看看下面這個純函式寫法,純函式給了我們足夠多的資訊,我們想在B專案使用其功能只需將單個方法搬過去再給其注入需要的引數即可 const signUp = function(Db, Email, attrs) { return function() { var user = saveUser(Db, attrs); welcomeUser(Email, user); }; };
可測試性
綜上所述,這個就很簡單了,我們不需要關心其它外部的資訊,只需要給函式特定的輸入,再斷言其輸出就好了
總結
- 輸出不依賴外部變數
- 輸出不改變外部變數
- 固定輸入固定輸出
- 可快取,可移植,可測試
關於JS每日一題
JS每日一題可以看成是一個語音答題社群
每天利用碎片時間採用60秒內的語音形式來完成當天的考題
群主在次日0點推送當天的參考答案
- 注 絕不僅限於完成當天任務,更多是查漏補缺,學習群內其它同學優秀的答題思路