今天看了一个关于函数式编程的文档很有意思,里面提到了函数柯里化,研究了一下,
函数柯里化的定义:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
通过上面的定义可以看出,柯里化是一个函数返回另一个函数,这是一个典型的闭包,它封装了一部分不变的内容,然后去处理其他可变的数据
例如我们在使用ajax的时候url是不变的,但是传递的参数不同将返回不同的数据,那么我们就可以把url封装到一个函数里然后返回一个带参数的函数,通过返回的函数去处理不同参数的情况
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")
//请求参数code为112
userRequest({
code:112
}).then(res=>{
//请求成功
console.log(res)
})
//请求参数code为114
userRequest({
code:114
}).then(res=>{
//请求成功
console.log(res)
})
上面的两个请求参数不同,但是请求的地址url是固定不变的。这就是柯里化,将不变的参数通过闭包的形式封装起来,然后去处理可变的参数
lodash中有一个柯里化方法curry。举个官网的例子:
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]
具体用法官网说明很清楚我就不再赘述了。
网友评论