JS函数式编程--柯里化

定义:在数学和计算机科学中,柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术。

作用:前端使用柯里化的用途主要就是简化代码结构,提高系统的维护性,一个方法,只有一个参数,强制了功能的单一性,很自然就做到了功能内聚,降低耦合。

优点:降低代码的重复,提高代码的适用性。

调用形式:

function add(a,b,c,d){
  return a + b + c + d;
};
var newAdd = Curry(add);    //将add函数柯里化
//柯里化之后的newAdd函数执行方式,传入剩余的参数。
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(1)(2,3)(4);

柯里化前奏:

//柯里化就是期望下一次能够把所有的参数传入完毕。
function FixedParamsCurry(fn){
  //arguments=[add,1,2]
  var _arg = [].slice.call(arguments, 1);
  return function(){
    //arguments=[2,3]
    var newArg = _arg.concat([].slice.call(arguments, 0));
    return fn.apply(this, newArg);
  }
}                
var newAdd = FixedParamsCurry(add,1);  //传入参数。这里是传入了1个参数
console.log(newAdd(2,3,4));   //此处必须要将剩余的参数填满。这里将剩余的3个参数传入。(期望这一次把参数全部传入完毕)

柯里化具体实现:

原理:期望下一次将参数补齐。

function Curry(fn, length){
  // fn.length返回的是该函数需要的参数的个数
  var length = length || fn.length;
  return function(){
    if(arguments.length < length){
      //[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);
    }
  }
}

柯里化具体应用:

//此处ajax只是示意而已
//POST www.test1.com 'name=djl&age=22'
//POST www.test1.com 'key=111'
//POST www.test2.com 'name=djl&age=22'
//POST www.test2.com 'key=222'
function ajax(method, url, data){
  console.log(method, url, data);
}

//场景:参数的代码重复性太高,每次都要写重复的参数
ajax('POST', 'www.test1.com', 'name=djl&age=22');
ajax('POST', 'www.test1.com', 'key=111');
ajax('POST', 'www.test2.com', 'name=djl&age=22');
ajax('POST', 'www.test2.com', 'key=222');

//使用柯里化简化代码:针对‘POST’的参数传入省略
var ajaxCurry = Curry(ajax);
var postAjax = ajaxCurry('POST');
postAjax('www.test1.com', 'name=djl&age=22');
postAjax('www.test2.com', 'name=djl&age=22');

//还可以再继续细分,争对域名‘www.test1.com’省略参数
var test1PostAjax = Curry(postAjax);
test1PostAjax('name=djl&age=22');
test1PostAjax('key=111');






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值