定义
柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。
function sum(num1, num2) {
return num1 + num2;
}
// 执行sum函数 ,一次需传入两个参数
sum(1,2); //3
// 假设有一个curry函数做到柯里化
var sumCurry = curry(add);
addCurry(1)(2); // 3
柯里化用途
// ajax 示例
function ajax(type, url, data) {
var xhr = new XMLHttpRequest();
xhr.open(type, url, true);
xhr.send(data);
}
// 虽然 ajax 这个函数非常通用,但在重复调用的时候参数冗余
ajax('POST', 'https://www.test.com', "name=kevin");
ajax('POST', 'https://www.test2.com', "name=kevin");
ajax('POST', 'https://www.test3.com', "name=kevin");
//利用curry
var ajaxCurry = curry(ajax);
// 以发送Post请求为例
var post = ajaxCurry('POST');
post('www.test.com', "name=kevin");
// 以POST类型请求来自于 https://www.test.com 的数据
var postFromTest = post('https://www.test.com');
postFromTest("name=kevin");
- curry用途可以理解为: 参数复用,本质上是降低通用性, 提升适用性。
例子二:
var arr = [{id:1, name: 'A'},{id:2, name: 'B'}];
// 获取所有的name
var names = arr.map(item => {
return item.name; //这么写为了突出 curry
})
如果柯里化
var prop = curry(function(k, item) {
return item[k];
})
var names = arr.map(prop('name'));
为了获取name这么麻烦, 但其实prop 方法可针对大量业务场景,多次使用,而且增加了代码的可读性。
arr.map(prop('name')) 就好像直白的告诉你:arr 对象遍历(map)获取(prop) name 属性。
实现 sum curry
function sum(num1, num2) {
return num1 + num2;
}
function curry(fn) {
var args = [].slice.call(arguments, 1);
return function () {
return fn.apply(this, args.concat([].slice.call(arguments)));
}
}
var sum1 = sum(1,2); //3
var sumCurry = curry(sum,1,2);
sumCurry(); //3
var sumCurry2 = curry(sum,1);
sumCurry2(2); // 3