JS之柯里化

什麼是柯里化

柯里化(Currying)是一種關於函數的高階技術,它不僅被用於JavaScript,也能用於其他語言

柯里化是一種函數 轉換,讓函數具有完整功能的同時,也能接受可選的參數。它能將一個函數從f(a,b,c)轉換爲f(a)(b)( c )

柯里化是一種將函數進行轉換的技術,而不會去調用函數

柯里化的實現

實現柯里化

//構造柯里化函數
function curry(fun){
    return function(a){
        return function(b){
            return fun(a,b);
        };
    };
}

function sum(a,b){
	return a + b;
}
//執行柯里化變成了偏函數
let curriedSum = curry(sum);
console.log(curriedSum(1)(2)); //3

lodash庫_.curry方法中也有實現柯里化的方法

function sum(a, b) {
  return a + b;
}

let curriedSum = _.curry(sum); // 使用來自 lodash 庫的 _.curry

alert( curriedSum(1, 2) ); // 3,仍可正常調用
alert( curriedSum(1)(2) ); // 3,以偏函數的方式調用

高級柯里化

可用於多參數函數的柯里化實現

//高級柯里化
function curry(fun){
    return function curried(...args){
      if(args.length >= fun.length){
          return fun.apply(this,args);
      }else{
          return function(...args2){
              return curried.apply(this,args.concat(args2));
          }
      }  
    };
}

function sum(a,b,c){
    return a + b + c;
}
let curriedSum = curry(sum);

console.log(curriedSum(1,2,3)); //6 仍然可以正常調用
console.log(curriedSum(1)(2,3)); //6 對第一個參數柯里化
console.log(curriedSum(1)(2)(3)); //6 全柯里化

柯里化只能對確定參數長度的函數有效,若是fun(…args)的函數就無法柯里化

參考鏈接: https://zh.javascript.info/currying-partials

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章