什么是柯里化?
柯里化(Currying)是一种对于函数的高阶转换,它指的是将一个函数从可调用的 fn(a, b, c)
转换成可调用的 fn(a)(b)(c)
如何进行柯里化
举个例子,我们有个普通的 ajax
函数来发起请求
function ajax(method, url, data=null) {
let xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.send(data);
}
- 在进行柯里化之前,我们先创建一个最简单版本的
curry
函数来将普通函数转换成柯里化的函数function curry(fn) { return function(method) { return function(url) { return function(data) { return fn(method, url, data); } } } }
- 使用这个最简单版本的
curry
函数来进行柯里化,并使用这个柯里化后的函数let ajaxCurried = curry(ajax); ajaxCurried("get")("http://a.itying.com/api/productlist")()

柯里化有什么用?
貌似fn(a, b, c)
调用和 fn(a)(b)(c)
调用没什么区别,但是当函数需要一定程度但不完全复用时,柯里化后的函数的优势就显而易见了。例如以上面的代码为例,我们现在请求的接口需要替换成另一批,但是方法还是get
,传统的函数调用写的就是:
let get_xx1 = ajax('get','api/xx1');
let get_xx2 = ajax('get','api/xx2');
而采用柯里化后的函数就可以这样:
let getAjax = ajaxCurried("get");
getAjax("api/xx1");
getAjax("api/xx2");
柯里化后的函数就能根据调用的特定参数进行我们想要的复用。例如:
//get请求 可更换 baseURL
let curriedAjaxGet = ajaxCurried("get")
curriedAjaxGet(baseURL1)()
curriedAjaxGet(baseURL2)()
// 基于 BaseURL 的 post 请求, 可添加 data 参数
/let curriedAjaxGetBaseURL = ajaxCurried("post")("xxxx")
curriedAjaxGetBaseURL(data1)
curriedAjaxGetBaseURL(data2)
网友评论