Skip to content

JS 函数柯里化 #28

Open
Open
@myLightLin

Description

@myLightLin

概念

柯里化就是将一个多参数的函数转换成单参数调用。比如有个函数 f(a, b, c) ,通过柯里化后变成 f(a)(b)(c)

柯里化可以做什么

柯里化可以方便的在现有函数基础上扩展出新功能函数,比如有个日志记录函数 log(now, type, message),它接收三个参数,第一个参数 now 代表日志的打印时间,第二个参数 type 代表日志的级别,第三个参数代表日志内容。现在我们这样使用它:

log(new Date(), 'error', '这是日志信息')

每次我们调用 log 函数,都需要传入三个完整参数,而我们在写业务逻辑时,大部分时候日志信息都是相似的,比如同一段逻辑代码里的日志时间是一样的,这时我们就可以通过柯里化,实现一个自带当前时间记录的 logNow 函数:

import _ from 'lodash'
const curryLog = _.curry(log)
const logNow = curryLog(new Date())

// 记录日志,时间自动就是当前时间
logNow('error', '这是错误日志')

可以看到,柯里化使得我们可以生成函数的部分调用。柯里化后的函数不会丢失任何东西,只是在调用方式上更灵活了。

柯里化的实现

以下是简单的柯里化实现,更完整的实现可以参考 lodash 源码中的 curry 函数:

function 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))
      }
    }
  }
} 

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions