js 什么是函数柯里化,如何实现函数柯里化

本文介绍了函数柯里化的基本概念,展示了如何通过闭包实现柯里化,以及通用的柯里化函数的编写过程。通过实例演示了柯里化函数在参数传递上的灵活性。
摘要由CSDN通过智能技术生成

函数柯里化(Currying)是一种将使用多个参数的函数转换成一系列使用一个参数的函数的技术。举例来说明,一个普通的函数可能接受两个参数然后执行操作:

function add(a, b) {
    return a + b;
}

这个函数接受两个参数ab,然后返回它们的和。

柯里化版本的add函数可以是这样的:

function curryAdd(a) {
    return function(b) {
        return a + b;
    };
}

这个curryAdd就是一个柯里化函数,它可以接受第一个参数a并返回一个新的函数,这个新函数接受第二个参数b并返回他们的和,这样就可以实现逐个传递参数:

const addTen = curryAdd(10); // 这里已经给a传值了
console.log(addTen(5));      // 15,现在给b传值

实现函数柯里化的通用方式是使用闭包。闭包是一个有权访问另一个函数作用域内变量的函数。当一个函数返回另一个函数,并且这个返回的函数引用了外部函数的变量,那么这些变量会一直存在,即使外部函数已经执行完毕。

我们可以写一个通用柯里化函数,这个函数可以将传进来的任意函数转化为柯里化函数:

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

我们来详细分析一下curry函数:

1.curry函数首先检查传入的func函数的参数数量(func.length)。这个属性表示函数期望接收的参数数量。

2.如果传入柯里化函数的参数数量(args.length)已经等于或超过了func的参数数量,说明已经传入了足够的参数,这时curry函数会直接调用原始函数func,传入累积的所有参数,并返回结果。

3.如果传入的参数数量还不够,curry函数会返回一个新的函数。这个新函数是一个闭包,它保留了对curry函数作用域内args数组的引用,并且能够继续接收新的参数。

4.当新的参数传入时,curried函数会将它们添加到args数组中。当args数组的长度达到func所需的参数数量时,它会调用原始函数func

5.为了能够正确地累积参数,curry函数使用了concat方法,将新传入的参数数组args2合并到args数组中。

通过这种方式,curry函数能够将任意数量的参数函数转换成一系列使用一个参数的函数,从而实现柯里化:

const add = (a, b) => a + b;
const currieAadd = curry(add);

console.log(currieAadd(1)(2)); // 输出: 3
  • 19
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值