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
}

純函數的好處

相信你們發現了,不管是概念仍是代碼理解都很簡單, 那爲何要使用純函數呢? 下面咱們羅列一下使用純函數的好處app

  • 可緩存性
  • 可移植性
  • 可測試性
可緩存性

純函數能夠根據輸入來作緩存函數式編程

// 下面的代碼咱們能夠發現相同的輸入,再第二次調用的時候都是直接取的緩存
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);
  };
};
可測試性

綜上所述,這個就很簡單了,咱們不須要關心其它外部的信息,只須要給函數特定的輸入,再斷言其輸出就行了code

總結

  • 輸出不依賴外部變量
  • 輸出不改變外部變量
  • 固定輸入固定輸出
  • 可緩存,可移植,可測試

關於JS每日一題

JS每日一題能夠當作是一個語音答題社區
天天利用碎片時間採用60秒內的語音形式來完成當天的考題
羣主在第二天0點推送當天的參考答案cdn

  • 注 毫不僅限於完成當天任務,更可能是查漏補缺,學習羣內其它同窗優秀的答題思路

點擊加入答題get

相關文章
相關標籤/搜索