qiuhongbingo / blog

Writing something in Issues.
https://github.com/qiuhongbingo/blog/issues
3 stars 0 forks source link

curry 化分析 #34

Open qiuhongbingo opened 4 years ago

qiuhongbingo commented 4 years ago
/**
 * 简单来说,柯里化就是在一个函数中预先填充几个参数
 * 这个函数返回另一个函数,这个返回的新函数将其参数和预先填充的参数进行合并,再执行函数逻辑
 */

// 举例
const filterLowerThan10 = array => {
  let result = []
  for (let i = 0, length = array.length; i < length; i++) {
    let currentValue = array[i]
    if (currentValue < 10) result.push(currentValue)
  }
  return result
}

// filterLowerThan10 还是硬编码写死了 10 这个阈值,我们用 curry 化的思想将其改造
const filterLowerNumber = number => {
  return array => {
    let result = []
    for (let i = 0, length = array.length; i < length; i++) {
      let currentValue = array[i]
      if (currentValue < number) result.push(currentValue)
    }
    return result
  }
}

const filterLowerThan10 = filterLowerNumber(10)

filterLowerThan10([1, 3, 5, 29, 34])

/**
 * 实现 add 方法,要求
 * add(1)(2) == 3 // true
 * add(1)(2, 3)(4) == 10 // true
 */
const add = (...arg1) => {
  let args = [...arg1]
  const fn = (...arg2) => {
    args = [...args, ...arg2]
    return fn
  }
  fn.toString = function() {
    return args.reduce((prev, item) => prev + item, 0)
  }
  return fn
}
/**
 * 分析这道题:add 函数每次执行后一定需要保证返回一个函数,以供后续继续调用,且返回的这个函数还有返回自身,以支持连续调用
 * 同时,为了满足例题条件,需要改写内部返回的函数 toString
 * 为了进行“求和”操作,需要在 add 函数内部维护一个闭包变量 args,args 是个数组,记录了每次调用是传进来的参数
 * toString 方法体中对参数进行求和,fn 方法体中对数组 args 进行添加当前参数的操作
 */