今天看了一個關于函數(shù)式編程的文檔很有意思,里面提到了函數(shù)柯里化,研究了一下,
函數(shù)柯里化的定義:是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結果的新函數(shù)的技術。
通過上面的定義可以看出,柯里化是一個函數(shù)返回另一個函數(shù),這是一個典型的閉包,它封裝了一部分不變的內容,然后去處理其他可變的數(shù)據(jù)
例如我們在使用ajax的時候url是不變的,但是傳遞的參數(shù)不同將返回不同的數(shù)據(jù),那么我們就可以把url封裝到一個函數(shù)里然后返回一個帶參數(shù)的函數(shù),通過返回的函數(shù)去處理不同參數(shù)的情況
function requestCurry(url){
return function(params){
return new Promise((resolve,reject)=>{
axios({
method:"post",
url:url,
data:{
...params
}
}).then(res=>{
resolve(res)
}).catch(err=>{
reject(err)
})
})
}
}
const userRequest = requestCurry("http://192.168.0.0.1/user")
//請求參數(shù)code為112
userRequest({
code:112
}).then(res=>{
//請求成功
console.log(res)
})
//請求參數(shù)code為114
userRequest({
code:114
}).then(res=>{
//請求成功
console.log(res)
})
上面的兩個請求參數(shù)不同,但是請求的地址url是固定不變的。這就是柯里化,將不變的參數(shù)通過閉包的形式封裝起來,然后去處理可變的參數(shù)
lodash中有一個柯里化方法curry。舉個官網(wǎng)的例子:
var abc = function(a, b, c) {
return [a, b, c];
};
var curried = _.curry(abc);
curried(1)(2)(3);
// => [1, 2, 3]
curried(1, 2)(3);
// => [1, 2, 3]
curried(1, 2, 3);
// => [1, 2, 3]
具體用法官網(wǎng)說明很清楚我就不再贅述了。