簡單封裝一個柯里化函數調用函數

代碼以下:html

  最近在研究函數式編程,而後正好複習許久沒有使用過的函數柯里化了,就簡單封裝了一個柯里化函數,註釋很完善就很少解釋了編程

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
       
       function curry(fn){
           //去掉curry第一個參數 該參數是後續參數傳遞結束的一個函數
           //而且轉換爲一個數組
            let args = [].slice.call(arguments,1);
            //獲取須要柯里化執行函數的形參參數個數
            let len = fn.length;
            //定義變量得到傳入參數個數
            let newLen = args.length;
            //參數未傳遞結束繼續返回函數就行傳參
            function __curry(){
                //保持除調用函數外全部參數
                 args.push(...arguments)
                //參數不夠時保存每次傳參個數
                newLen+=arguments.length;
                //判斷參數是否和須要調用函數的參數保持一致
                if(newLen === len){
                    //保持一致就傳入全部參數調用該函數
                    return fn.apply(this,args);
                }
                //不然返回函數繼續傳參
                return __curry;   
            }
            //判斷是否一次性傳完參數若是傳完參數則傳入參數調用須要調用的函數
            if(args.length === len){
                return fn.apply(this,[...args]);
            }
            //一次性參數傳多了返回提高字符串
            if(args.length > len){
                return "參數傳多了";
            }
            //返回__curry函數
            return __curry;
       }

       //使用柯里化調用 的函數
       function add(a,b,c,d){
           return a+b+c+d;
       }
       //測試
       console.log(curry(add,1,2,3,4));//輸出 10
       console.log(curry(add,1,2,3)(4));//輸出 10
       console.log(curry(add,1,2)(3)(4));//輸出 10
       console.log(curry(add,1)(3)(4)(2));//輸出 10
       console.log(curry(add)(3)(4)(2)(1));//輸出 10
       console.log(curry(add)(3)(4)(2)(1));//輸出 10
       console.log(curry(add,1,2,3,4,5));//輸出 參數傳多了
    </script>
</body>
</html>

這樣一個柯里化函數調用函數就完成了!數組

相關文章
相關標籤/搜索