柯里化(Currying)

柯里化(Currying)

  • 当一个函数有多个参数的时候先传递一部分参数调用它(这部分参数以后永远不变)
  • 然后返回一个新的函数接受剩余的参数,返回结果
// 普通纯函数
function checkAge(min, age) {
    return age >= min
}

// 柯里化
// function checkAge1(min) {
//     return function(age) {
//         return age >= min
//     }
// }

// 柯里化
const checkAge1 = min => (age => age >= min)

const checkAge18 = checkAge1(18)
const checkAge20 = checkAge1(20)
console.log(checkAge18(24)) // true
console.log(checkAge20(18)) // false

lodash 中的柯里化函数

  • _.curry(func)
    • 功能:创建一个函数,该函数接受一个或多个func的参数,如果func所需要的参数都被提供则执行func并返回执行的结果,否则继续返回并等待接收剩余的参数
    • 参数:需要柯里化的函数
    • 返回值:柯里化后的函数
const _ = require('lodash')

// 需要柯里化的函数
function getSum(a, b, c) {
    return a + b + c
}

// 柯里化后的函数
const curried = _.curry(getSum)
console.log(curried(1, 2, 3)) // 6
console.log(curried(1)(2, 3)) // 6
console.log(curried(1, 2)(3)) // 6
console.log(curried(1)(2)(3)) // 6
  • 案例:返回有空格的数值
const _ = require('lodash')

const match = _.curry((reg, str) => str.match(reg))
const haveSpace = match(/\s+/g)

const filter = _.curry((func, array) => array.filter(func))

const findSpace = filter(haveSpace)
console.log(findSpace(['John Connor', 'javascript'])) // [ 'John Connor' ]
  • 模拟 _.curry() 的实现
function curry(func) {
    return function curriedFn(...args) {
        // 判断实参与形参的个数
        if (args.length < func.length) {
            return function() {
                return curriedFn(...args.concat(Array.from(arguments)))
            }
        }
        // 实参和形参个数相同,调用func, 返回结果
        return func(...args)
    }
}

function getSum(a, b, c) {
    return a + b + c
}

// 柯里化后的函数
const curried = curry(getSum)
console.log(curried(1, 2, 3)) // 6
console.log(curried(1)(2, 3)) // 6
console.log(curried(1, 2)(3)) // 6
console.log(curried(1)(2)(3)) // 6

总结

  • 柯里化可以让我们给一个函数传递较少的参数得到一个已经记住了某些固定参数的新函数
  • 这是一种对函数参数的“缓存”
  • 让函数变得更加灵活,让函数的粒度更小
  • 可以把多元函数转换成一元函数,可以组合使用函数产生强大的功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值