一文秒懂函数柯里化与合成

154 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

函数式编程

函数式编程倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算。
函数式编程有两个基本的运算:合成(compose)和柯里化 (Currying)

合成(compose)

如果一个值要经过多个函数,才能变成另外一个值,就可以把所有中间步骤合并成一个函数,这叫做函数合成。
成的好处是,它让代码变得简单而富有可读性,比较灵活,同时通过不同的组合方式,可以轻易组合出其他常用函数,让代码更具有表现力。
举个栗子:

image.png
看输出结果:

image.png

image.png 这里面明显简化了一些繁琐的代码,增加可读性,这段代码是第二个函数运行时总是拿到上一个函数返回的值,如果这种操作很多的情况下,那就显得特别繁琐臃肿冗余。这里用了reduce函数去合并这些函数。

柯里化(Currying)

柯里化,又译为卡瑞化或加里化,是把接受多个参数函数变换成接受一个单一的参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数技术。
所谓柯里化,就是把一个多参数的函数,转换为单参数的函数。
举个栗子:
柯里化之前:

function add(a,b){
  return a+b
}  
add(1,2);//3

柯里化后:

function add(a){
  return function(b){
  return a+b
  }
}  
add(1)(2);//3

可以这样调用上述函数:(add(1))(2)或者add(1)(2)。
上述代码柯里化之前是一次性传了2个参数,而柯里化后,是先传了一个参数,闭包保存着,然后有记着这个a参数值,最后直接可以计算,最后返回这个内部的新函数以及值。

再看一个栗子:

function add(a){
  return function(b){
  return a+b
  }
}  
var result1=add(1);    
var result2=add(3); 
result(2);  //3
result2(5); //8

这里也是定义了一个add函数,它接受一个参数并返回一个新函数。调用add之后,返回的函数就通过闭包的范式记住了add的第一个参数。一次性的调用它太过于繁琐,好在可以使用一个特殊的curry帮助函数是这类函数定义和调用更加容易。