柯里化currying

77 阅读1分钟

柯里化(Currying)

  • 作用:将接收多个参数的函数,转化为传递多次单一参数的函数。即:将f(a,b,c) 转化为 f(a)(b)(c)

场景:

  • 打折扣account,计算多个商品的时候,如果每次都需要输入:'商品的价格' 与 '折扣',这样就会发现重复的输入了多次折扣,因此就可以优化 优化思路:
  • 就是固定折扣account不变,每次只需要输入不同的商品的价格即可

应用柯里化:

// 创建
function getAccount(account) {
  return function price(goodPrice) {
    return account * goodPrice
  }
}

// 调用
const res = getAccount(0.1)
// 价格为123的商品
console.log(res(123))
// 价格为523的商品
console.log(res(523))

柯里化的js手写题

function currying(fn, ...args) {
  const len = fn.length
  let allArgs = [...args]
  const res = (...params) => {
    allArgs = [...args, ...params]
    if (allArgs.length === len) {
      return fn(...allArgs)
    } else {
      return res
    }
  }
  return res
}

// 调用
const add = (a, b, c) => {
  return a + b + c
}
// 返回一个锁定第一个参数为8的函数
const restHandler = currying(add, 8)
// 后续计算的所有都基于8,否则重新调用currying
restHandler(5,3)  // 16