let xs = [1,2,3,4,5] // 純函數 xs.slice(0,3) //[1,2,3] xs.slice(0,3) //[1,2,3] xs.slice(0,3) //[1,2,3] // 不純函數 xs.splice(0,3) //[1,2,3] xs.splice(0,3) //[4,5] xs.splice(0,3) //[]
將一個函數反覆執行,其中的值已經被改變了,從而影響後面的函數操做。一個純函數是不管什麼輸入,都只對應輸出一個惟一值。javascript
var min = 21; // 不純函數 var ckeck = function(age){ return age >= min; } // 純函數 var check = function(age){ var min = 21; return age >= min; }
一個優秀的純函數應該具備可移植性/自文檔化
,即經過輸入內容,就能夠看出函數的意圖。java
// 不純的 var signUp = function(attrs){ 一些反作用操做 } // 純的 var signUp = function(Db, Email, attrs){ return function(){ ...一些反作用操做 } }
反作用指,在進行操做的時候,更改了原有數據的形態,從而影響了數據的純潔性,對於此類數據應該放置在return
裏面。數據庫
反作用 緩存
採用memoize技術能夠進行緩存。函數
var square = memoize(function(x){ return x*x }) square(4) //16 square(4) //從緩存中讀取結果16