柯里化

柯里化函数免费看

柯里化的定义是什么,柯里化函数的设计思路是什么

2018-08-28侠课岛    中级进阶       

前端/前端/ES6函数式编程 8     0     1478

在百度百科上面对柯里化的定义是:

在计算机科学中,柯里化 (Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

一般定义函数时都会把函数所必须的参数全部定义清楚,所有的输入参数都是透明的,但是这里要讲的柯里化又叫部分求值,意思就是会先给函数传入部分参数,接收到这些参数后并不会马上返回函数的值,而是返回一个接收其他参数的函数,前面传进来的参数会通过闭包的形式保存起来,直到函数接收到它需要的所有参数后再运算,并返回最终的结果值。
柯里化函数的设计思路就是利用函数执行可以形成一个不被销毁的作用域原理,把部分需要预先处理的内容先保存在这个不销毁的作用域中,并返回一个接收剩余参数的相对小的函数,后续需要执行的就是这个小函数,执行时会把原先保存在函数作用域中的相关数据取出来运算。

const plus = (a = 0, b = 0 ) => {
  return (a + 10) * b
}

plus(2,3)

const plusCurry = (a = 0) => {
  const sum = a + 10
  return (b = 0) => {
    return sum * b
  }
}

plusCurry(2)(3)

对于 plus 来说,它接收两个参数 ab ,换一种实现方式 plusCurry ,先固定 a = 2 ,得到的是 (2+10)* b ,这种部分求值的方式被称作为函数式编程中的柯里化(Currying)
柯里化具有预处理、固定易变参数动态生成函数、提高函数适用性等特点。预处理特点比较有代表性的有 bind 方法,使用 bind 方法的目的就是把传递进来的 callback 回调方法中的 this 预先处理为执行环境的上下文 context ,到实际运行调用的时候再运行实际的方法体。

const bind = (callback, context) => {
  const otherArg = Array.prototype.slice.call(arguments,2)
  return () => {
    const innerArg = Array.prototype.slice.call(arguments,0)
    callback.apply(context,outerArg.concat(innerArg))
  }
}

另外一种使用比较频繁的应用场景就是通过不断缩少函数的使用范围,来达到提高函数适用性的目的,看下面的例子

const init = [1, 2, 3, 4, 5, 64, 23, 4, 5, 343, null, '', undefined]

// 获取数组中的奇数
const oldNum = (init) => {
    return init.filter((cur, index, arr) => {
        return cur % 2 !== 0
    })
}

// 删除数组中的假值
const valid = (init) => {
    return init.filter((cur, index, arr) => {
        return Boolean(cur)
    })
}

根据不同的业务场景,避免不了对同一份数据有不同的处理以获取不同的满足业务的数据。显然,例子中的代码重复率很高,产生了比较多的冗余代码,且每个函数都只能使用一种场景,并不够通用,一般来说,为了使函数提供函数的通用性,会把重复部分抽离出来,通过参数的形式传入,把上面的例子改造下。

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

8

本课评分:
  •     非常好
难易程度:
  •     适中的
|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?