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');






阅读更多
个人分类: javascript
上一篇深入js运行机制之--setTimeout/setInterval【深度理解】
下一篇JS高阶--javascript数组扁平化
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭