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函数的柯里化。

目录
相关文章
|
11天前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
24天前
|
缓存 监控 前端开发
JavaScript 实现大文件上传的方法
【10月更文挑战第17天】通过以上步骤和方法,我们可以实现较为可靠和高效的大文件上传功能。当然,具体的实现方式还需要根据实际的应用场景和服务器要求进行调整和优化。
|
11天前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
11天前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
12天前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
24 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
10天前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
27 7
|
9天前
|
JavaScript 前端开发
JavaScript 原型链的实现原理是什么?
JavaScript 原型链的实现原理是通过构造函数的`prototype`属性、对象的`__proto__`属性以及属性查找机制等相互配合,构建了一个从对象到`Object.prototype`的链式结构,实现了对象之间的继承、属性共享和动态扩展等功能,为 JavaScript 的面向对象编程提供了强大的支持。
|
10天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
11天前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
17天前
|
前端开发 JavaScript
JS-instanceof 的实现原理
`instanceof` 运算符在前端 JavaScript 中用于检测对象的原型链是否包含指定构造函数的 `prototype` 属性。它通过遍历对象的原型链来实现。每个对象都有一个内部链接 `[[Prototype]]` 指向其原型对象,当访问属性或方法时,JavaScript 引擎会沿着原型链查找。`instanceof` 的具体实现是通过比较对象的原型链中的原型与构造函数的 `prototype` 属性,直到找到匹配的原型或到达原型链的顶端。示例代码展示了如何使用 `instanceof` 检查对象的继承关系。此外,`instanceof` 可用于验证继承关系和类型检查,支持多态性。