js函数柯里化
在数学和计算机科学中,柯里化是一种将使用多个参数
的一个函数转换成一系列
使用一个参数
的函数的技术。
为什么柯里化
前端使用柯里化的用途主要是简化代码结构,提高系统的维护性,一个方法,只有一个参数,强制了功能的单一性,很自然就做到了功能内聚,降低耦合。
柯里化的优点就是降低代码的重复,提高代码的适应性。
调用形式
function add(a, b, c){};
// 对add柯里化
var newAdd = Curry(add);
newAdd(1)(2)(3);
实现对add的柯里化
function add(a, b, c, d){
return a + b + c + d;
}
定义函数,两个函数对参数合并
function FixedParamsCurry(fn){
// 拿到首次传入的参数
var _args = [].slice.call(arguments, 1);
return function(){
// 拿到返回函数传入的参数,两此参数合并一个数组
var newArgs = _args.concat([].slice.call(arguments, 0))
return fn.apply(this, newArgs);
}
}
使用
var newAdd = FixedParamsCurry(add, 1)
newAdd(2, 3, 4)
newAdd(1, 1, 1)
FixedParamsCurry函数在两次调用中必须将参数传递完,需要实现下面的调用形式
var newAdd = Curry(add);
newAdd(1, 2, 3, 4)
newAdd(1)(2, 3, 4)
newAdd(1, 2)(3)(4)
newAdd(1, 2)(3, 4)
newAdd(1, 2, 3)(4)
newAdd(4)(1, 2, 3)
newAdd(1)(2)(3)(4) // 常用
柯里化
function Curry(fn, length){
// 函数.length获取函数传递参数个数
var length = length || fn.length;
return function(){
if(arguments.length < length){
// [fn].concat([1]) [fn, 1];
var combined = [fn].concat([].slice.call(arguments, 0));
return Curry(FixedParamsCurry.apply(this, combined), length - arguments.length);
}else{
return fn.apply(this, arguments);
}
}
}
使用
var newAdd = Curry(add);
// var num = newAdd(1)(2)(3)(4) // 10
// nA1缓存函数,把参数1缓存,可以服用此带参数的函数
var nA1 = newAdd(1)
var na11 = nA1(1)(1)(1)
var nA12 = nA1(3)(3)(3)
应用
// 示意而已
function ajax(type, url, data){
var xhr = new XMLHttpRequest();
xhr.open(type, url, true);
}
// 虽然ajax这个函数非常通用,但在重复调用的时候参数冗余
ajax('POST'. 'www.test1.com', 'name=xiuluo');
ajax('POST'. 'www.test2.com', 'name=xiuluo');
ajax('POST'. 'www.test3.com', 'name=xiuluo');
// 利用curry
var ajaxCurry = Curry(ajax);
// 以post类型请求数据
var post = ajaxCurry('POST');
post('www.test1.com', 'name=xiuluo');
// 以POST类型请求来自于www.test1.com的数据
var postFromTest = post('www.test1.com');
postFromTest('name=xiuluo');
1
1
1
1
1
1
1
1
1
1