js-函数柯里化

199 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

函数柯里化

介绍

函数柯里化 ,是一种高阶函数的一种用法。

目的 就是为了 减少函数的传参,并且将一些固定的参数在函数内部私有化。

函数柯里化

在我们开发时,总会创建函数,来进行执行。可能每次不同的函数传递不同数量的参数,有些函数传递很多参数,又有很多函数几乎不需要传递什么参数。

函数柯里化 的作用,就是主要将本应该要接受 很多参数 的的函数。变成只需要对该函数传递 一,两 个参数达到同样的效果,多余的固定参数该函数内部调用内部函数,最后返回同样的结果。

这里给个简单的例子

我们来拼接一个网址 url

上面是我们的需求,接下来写代码,相信下面的不陌生,这个可能是我们大多数方式来写的

const concatUrl = (a,b,c) =>{
  return `${a}${b}${c}`
}

concatUrl('https://','lodash.com/','docs/4.17.15#curry')

我们都知道 https:// 我们不用进行填写,那我们如何改造成函数柯里化呢?

接下来进行函数柯里化:

const concatUrl = (a) => {
  return (b, c) => {
    return `${a}${b}${c}`
  }
}

const urlHttps = concatUrl('https://')

urlHttps('lodash.com/', 'docs/4.17.15#curry')

可以看到参数减少了一个。

复杂例子

这里再给一个关于 函数柯里化 的例子:

// currying(f) 执行柯里化转换
const currying = (f) => {
  return (a) => {
    return (b) => {
      return f(a, b)
    }
  }
}

// 用法
const sum = (a, b) => {
  return a + b
}

const curriedSum = currying(sum)

console.log(curriedSum(1)(2))

这里可以看到,上面的函数每次调用后,继续返回一个新的函数,直到最后返回 sum 函数。

然后就会吐槽,这么做的目的。

这里再看一下 lodash 库里面的 函数柯里化

如果应用 lodash 库 里面的 函数柯里化 的话,效果如下:

const sum = (a, b) => {
  return a + b
}

let curriedSum = _.curry(sum)

console.log(curriedSum(1, 2))
console.log(curriedSum(1)(2))

从上面可以看到一个问题,就是我们写的函数柯里化,是一个不健康的,因为总不能函数内部一直这样嵌套着函数。

需要通过 apply 方法来进行。

const curry = (func) => {
  return function curried(...args) {
    if (args.length >= func.length) {
      return func.apply(this, args)
    } else {
      return function (...args2) {
        return curried.apply(this, args.concat(args2))
      }
    }
  }
}

const sum = (a, b, c) => {
  return a + b + c
}

let curriedSum = curry(sum)

console.log(curriedSum(1, 2, 3))
console.log(curriedSum(1)(2, 3))
console.log(curriedSum(1)(2)(3))

总结

函数柯里化 是高阶函数,减少函数的传参,固定参数内部私有化。