什麼是柯里化
柯里化(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