函數式編程之純函數


純函數 我們應該還記得初中的一些數學知識,函數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

柯里化就是先傳遞部分參數返回一個函數去處理剩下的參數(這里因為閉包對參數進行保存)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM