手写JS-柯里化函数的实现

摘要:经过手写一个小例子大家应该基本了解了什么是函数柯里化,并且实现了 curry 函数:用闭包把传入参数保存起来,当传入参数的数量足够执行函数时,就开始执行函数

前言

什么是函数柯里化呢?所谓”柯里化”,简单来说就是把一个多参数的函数,转化为单参数函数。

手写一个简单的小例子:

// 柯里化之前
function add(a, b, c) {
    return a + b + c
}
add(1, 2, 3) // 6

// 柯里化之后
let addCurry = curry(add)
addCurry(1)(2)(3) // 6
 

而这个例子显然也并不完整,比如curry函数是如何实现的呢?接下来跟着实现一下。


实现curry函数

  • 可以理解所谓的柯里化函数,就是封装==一系列的处理步骤==,通过闭包将参数集中起来计算,最后再把需要处理的参数传进去。
  • 实现原理就是用闭包把传入参数保存起来,当传入参数的数量足够执行函数时,就开始执行函数。

通过实现 curry 这个函数,使函数从一次调用传入多个参数变成多次调用每次传一个参数。

使用ES6语法手写curry函数:(相对来说更加简洁也更加易懂)

const curry = fn => 
    judge = (...args) =>
        args.length >= fn.length
            ? fn(...args)
            : (...arg) => judge(...args, ...arg)

// Test
const fn = curry(function(a, b, c) {
    console.log([a, b, c]);
})

add(1, 2, 3) // 6
add(1, 2)(3) // 6
add(1)(2)(3) // 6
add(1)(2, 3) // 6
 
  1. 调用curry函数,获取函数fn的参数。
  2. 定义一个新的函数judge,接收参数为...args。
  3. 判断新函数接受的参数长度是否大于等于fn剩余参数需要接收的长度
  4. 满足要求,则执行fn函数,并传入新函数的参数
  5. 否则,返回一个新的匿名函数,这个函数把所有传入参数...args保存在arg数组中,而这个匿名函数被执行后,就把以前收到的参数数组和当前的参数数组合并后,放到前面说的逻辑中,在judge函数里判断,重复第3步。


总结

经过手写一个小例子大家应该基本了解了什么是函数柯里化,并且实现了 curry 函数:用闭包把传入参数保存起来,当传入参数的数量足够执行函数时,就开始执行函数。虽然不算太深入,怎么也算小有收获吧。


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_11425