JavaScript之柯里化

作用

函数柯里化,用于创建一个函数,这个函数是已经设置好了一个或者多个参数引用红宝书

其实就是说当一个函数 ,有多个参数的时候,先传递一部分函数参数然后调用它,然后返回一个新的函数,这个函数接受剩余参数,然后返回计算结果;

价值

提高参数复用性,优化代码,看下面demo
假设有这样一个需求,需要计算x*y的返回值

// 非柯里化计算2*y
const fn = (baseNum, currentNum) =>  baseNum * currentNum;
// 2 *3
fn(2,3)
// 2*4
fn(2,3)
....

// 柯里化计算2*y
const fn = baseNum => currentNum  => baseNum * currentNum;
const fn2 = baseNum(2)
//2*3
fn2(3)
//2*4
fn2(4)
....

看上面demo,2这个参数在非柯里化的时候重复出现,但是其实,这个参数完成是可以通过技术手法复用的就是柯里化,在柯里化之后,2这个参数就省略了

当然,现在有很多库都实现了柯里化函数比如 lodash中curry方法
为了跟好的理解,接下里啊模拟个curry方法

function curry (func) {
// 首先return一个函数
  return function curriedFcuntion(...args) {
   //通过解构,接受参数不确定的case 
   // 判断形参和实参的个数
   //形参指的是传入的函数参数的个数,这里指的就是getSum这个函数的形参
  // 获取函数形参,通过函数名.length方法获得
    if (args.length < func.length) {
      return function () {
        return curriedFcuntion(...args.concat(Array.from(arguments)))
      }
    }
   // 也可以使用 func.apply(this,[...args])
    return func(...args  )
  }
}

//测试下
function addSum (a, b, c) {
  return a + b + c
}

const curried = curry(addSum)

console.log(curried(1, 2, 3))
console.log(curried(1)(2, 3))
console.log(curried(1, 2)(3))
//6
//6
//6

总结

1、柯里化是对函数参数的一种缓存
2、使函数的颗粒度细腻
3、可以使多元函数转换成一元函数,进而组合使用生产更强大的函数

你可能感兴趣的:(JavaScript之柯里化)