每日一题:函数式编程curry的实现

247 阅读2分钟

curry简介

它是一个函数,可以接受一个函数作为参数,并返回一个接受下一个参数的函数,通过闭包的形式存储传入进来的参数,当参数的长度等于最初传进来的函数的参数长度时,开始执行最初的函数,如果参数的长度不相等,则直接返回方法。

下面来看看它具体的效果。

function add (x, y, c) {
  return x + y + c
}

const curry_add = curry(add)
curry_add(1)
curry_add(2)(3)

根据上面的效果和简介,我们自己来实现一个curry。

代码实现

第一步

// 是一个函数,接受一个函数作为参数,返回一个函数
function curry (fn) {
  return function () { }
}

第二步

// 可以分步处理参数,即返回新函数的时候传了一部分参数,在调用这个新函数时还可以另外再传入参数

function curry (fn) {
  const context = this // 记录环境执行上下文
  return function (...args) {
    // 将传进来的参数与当前的参数使用ES6语法进行合并
    return fn.call(context, ...args, ...arguments)
  }
}

第三步

// 当参数的长度等于最初传进来的函数的参数长度时,开始执行最初的函数
// 如果参数的长度不相等,则直接返回方法

function curry (fn) {
  const context = this
  // 如果参数不相等,直接返回新函数,因此在这里我们需要将返回的函数来定义一个名字func
  return function func(...args) {
    // 参数长度和初始函数的参数长度相等,通过函数的length属性可以获取函数参数长度
    if (fn.length <= args.length) {
      return fn.call(context, ...args)
    }
    return func.call(context, ...args, ...arguments)
  }
}


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

const fn1 = curry(add)(1)

const fn2 = fn1(2)

console.log(fn2(3)) // 6