純函數 我們應該還記得初中的一些數學知識,函數f的概念就是,對於輸入x產生一個輸出y=f(x),這就是普通的純函數。它的定義是 相同的輸入,結果總會得到相同的輸出,而且沒有任何可觀察的副作用,也不依賴外部環境的狀態。
最常見的一個例子就是在我們操作數組的時候slice就是純函數,splice就是不純的,看下面的例子
<script> var arr = [1,2,3,4,5,6] ; console.log(arr.slice(0,3))//1,2,3 console.log(arr.slice(0,3))//1,2,3這是純函數相同輸入總是得到相同的輸出,可以這很函數式 console.log(arr.splice(0,3))//1,2,3 console.log(arr.splice(0,3))//4,5,6不純的相同輸入,不同輸出 </script>
我們不希望splice,因為它會把原來數據弄得一團糟
不依賴外部狀態 看看下面這個例子
var i = 20 ; function test(num) { if(num>i){//這里的行為是由外部環境決定的 將來會有很多不可預知的問題 //..dosomething }else { //..dosomething } } test(22) ; function test(num) { if(num>20){//雖然這里擴展性差但是,可以這很純,不會因為外部環境改變而影響 //..dosomething }else { //..dosomething } } test(22) ;
這里我們可以用柯里化解決擴展性問題
function test(min) { return function(num) { if(num>min) { console.log('大於20') ; }else{ console.log('小於20') } } } var compare = test(20) ; compare(20) ;//大於20
柯里化就是先傳遞部分參數返回一個函數去處理剩下的參數(這里因為閉包對參數進行保存)