JavaScript函数柯里化的实现原理,进来教你完成一个自己的自动实现柯里化方法

简介: JavaScript函数柯里化的实现原理,进来教你完成一个自己的自动实现柯里化方法

柯里化的实现原理:

接下来我们就自己手动实现柯里化。


1.目标:编写一个myCurring的函数,参数接收一个函数,调用自动实现柯里化。

2.思路步骤:

创建一个名字为myCurring的函数,接受的参数为 那个需要变为柯里化的函数,这里用fn 表示

函数内部返回一个名字为 curried 的函数,接收参数的个数为 fn 中参数的个数,这里使用剩余参数 ...args 接收

curried 函数内部 需要去判断当前已经接收的参数的个数,是否与参数本身需要接受的参数的个数一致了。

如果当前传入的参数 大于等于 需要接受的参数的个数时,执行函数,返回fn.apply(this, args)

如果不满足上述条件 ,也就是传入的参数没有达到要求的个数时,需要返回一个新函数 这里用curried2表示,接收的参数为第一次接收的参数后剩下的参数,这里使用...arg2 表示。

接收到参数后 curried2 函数执行,递归调用curried 函数,继续判断传入的参数的个数是否一致,一致则执行3.1的步骤,反之则继续递归调用 curried函数检查参数的一致性。

调用myCurring 函数,传入我们需要 柯里化的函数作为参数。

3.完整代码示例:

// 柯里化函数的实现  将 myCurrying 函数实现为自动柯里化函数
function myCurrying (fn) {
    return function curried (...args) {
        // 判断当前已经接收的参数的个数,是否与参数本身需要接受的参数的个数一致了
        // 1. 当前传入的参数 大于等于 需要接受的参数的个数时,执行函数
        if (args.length >= fn.length) {
            return fn.apply(this, args)
        } else {
            // 2.当前传入的参数,没有达到个数时,需要返回一个新的函数,继续来接收剩余的参数
            function curried2 (...args2) {
                // 接收到参数后,需要递归调用curried 来再一次检查函数参数的个数是否达标
                return curried.apply(this, args.concat(args2)) // concat方法用于拼接两个数组返回一个新数组
            }
            return curried2
        }
    }
}

4.检验代码的正确性,使用 myCurring 自动实现函数的柯里化

先看代码:

//  使用我们已经实现的柯里化的函数myCurring将sum函数进行柯里化转化
function sum (num1, num2, num3) {
    return num1 + num2 + num3
}
var result1 = sum(1, 2, 3)
console.log(result1) // 6
var result2 = myCurrying(sum) // sum函数作为参数传入 myCurrying 函数中
console.log(result2(1, 2, 3)) // 6

如上所示,result1 和 result2 输出的结果都是6,证明我们实现了sum函数的柯里化。

目录
打赏
0
0
0
0
2
分享
相关文章
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
187 69
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
111 0
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
180 80
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
77 19
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
有没有方法可以保证在JavaScript中多个异步操作的执行顺序?
140 58
深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。 在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
119 32
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问