JavaScript函數式程式設計中純函數的理解(程式碼)

不言
發布: 2019-03-15 14:35:35
轉載
2360 人瀏覽過

這篇文章帶給大家的內容是關於JavaScript函數式程式設計中純函數的理解(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

函數式程式設計中純函數如何理解?

概念: 不依賴執行的上下文,也不影響上下文的變量,輸出只由輸入決定

程式碼理解一下

// 综上,非纯函数,输入依赖外部变量 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); }; };
登入後複製
可測試性
綜上所述,這個就很簡單了,我們不需要關心其它外部的信息,只需要給函數特定的輸入,再斷言其輸出就好了

總結

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

#

以上是JavaScript函數式程式設計中純函數的理解(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!