JS函数式编程--柯里化

原创 2018年04月15日 21:42:27

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

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

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

调用形式:

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






js之惰性函数

利用函数的惰性载入提高javascript代码性能 在javascript代码中,因为各浏览器之间的行为的差异,我们经常会在函数中包含了大量的if语句,以检查浏览器特性,解决不同浏览器的兼容...
  • u013234372
  • u013234372
  • 2016-02-01 12:04:41
  • 1803

JavaScript-JS优化与惰性载入函数

惰性载入函数 由于现在浏览器之间的差异,为了实现跨浏览器工作,很多函数要书写大量if语句或者try…catch…语句。当每次调用函数时,都要对每个if分支或try语句进行检查,这样会使得浏览器反应变...
  • qiqingjin
  • qiqingjin
  • 2016-02-20 19:29:16
  • 1203

惰性函数与柯里化函数

首先先说下 什么是惰性函数,顾名思义懒惰的函数,常用于在解决浏览器兼容性方面,举个例子 在一个方法里面可能会涉及到一些兼容性的问题,不同的浏览器对应不同的方法,第一次我们遍历这些方法找到最合适的那个...
  • xiaoTuiMao
  • xiaoTuiMao
  • 2015-09-24 15:50:55
  • 547

javascript惰性函数

惰性函数有些地方也叫作自定义函数。做法是创建一个新函数并且将其分配保存了另外函数的同一个变量,那么就以一个新函数覆盖了就函数。在某种程度上,回收了旧函数指针以指向一个新函数。而这一切发生在就函数体的内...
  • qq_22509715
  • qq_22509715
  • 2017-05-23 14:26:32
  • 219

JavaScript基础----42JavaScript惰性函数(没写代码)

html> lang="en"> charset="UTF-8">
  • zhaihaohao1
  • zhaihaohao1
  • 2015-08-09 08:15:13
  • 223

函数式编程概念:柯里化(currying)

//函数式编程概念:柯里化(currying):将多参数的函数转为单参数的形式 function currying(fn,n){ return fu...
  • u010689306
  • u010689306
  • 2016-12-02 17:37:32
  • 515

JAVA 8函数式编程(三):柯里化与惰性求值

百度百科里是这么定义柯里化的: 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术...
  • yiifaa
  • yiifaa
  • 2017-07-02 16:24:03
  • 806

关于惰性函数加载

最常见的是利用js特有的同名函数覆盖的特性来优化js函数性能。 最常见的就是这样的一个写法。 function addEvent(element,type,fun){\ if(element.a...
  • baidu_28753677
  • baidu_28753677
  • 2016-09-23 21:52:05
  • 77

js性能优化之惰性加载函数

一个普通的浏览器嗅探技术,每次都要调用addEvent进行判断,执行if语句。// 浏览器嗅探技术:指的就是检测浏览器是否支持 var addEvent = function(elem, type, ...
  • sinat_25127047
  • sinat_25127047
  • 2017-04-26 11:33:22
  • 893

C# 函数式编程

编程语言范式 许多现存的编程语言都可基于其计算模型加以分类,归入某些语言族,或者属于某种编程范式。按照不同的规则,可以有多种分类的方法,而且不同的学者对某些语言的具体归属也有不同的意见。 给出一种...
  • snakorse
  • snakorse
  • 2015-10-30 09:49:07
  • 1620
收藏助手
不良信息举报
您举报文章:JS函数式编程--柯里化
举报原因:
原因补充:

(最多只允许输入30个字)