当前位置:首页 > JavaScript

js curry实现

2026-03-14 01:12:34JavaScript

柯里化(Currying)的概念

柯里化是一种将多参数函数转换为一系列单参数函数的技术。例如,一个接受三个参数的函数 f(a, b, c) 柯里化后会变为 f(a)(b)(c)。柯里化的核心是延迟执行,逐步传递参数。

实现基础柯里化

以下是一个简单的柯里化实现,支持固定参数数量的函数:

function curry(fn) {
    return function curried(...args) {
        if (args.length >= fn.length) {
            return fn.apply(this, args);
        } else {
            return function(...nextArgs) {
                return curried.apply(this, args.concat(nextArgs));
            };
        }
    };
}

示例用法:

function sum(a, b, c) {
    return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3)); // 输出 6

支持占位符的柯里化

通过占位符(如 _)可以跳过某些参数的传递,后续再补充:

function curryWithPlaceholder(fn) {
    return function curried(...args) {
        const complete = args.length >= fn.length 
            && !args.includes(curryWithPlaceholder.placeholder);
        if (complete) {
            return fn.apply(this, args);
        } else {
            return function(...nextArgs) {
                const mergedArgs = args.map(arg => 
                    arg === curryWithPlaceholder.placeholder && nextArgs.length 
                        ? nextArgs.shift() 
                        : arg
                ).concat(nextArgs);
                return curried.apply(this, mergedArgs);
            };
        }
    };
}
curryWithPlaceholder.placeholder = '_';

示例用法:
```javascript
function sum(a, b, c) {
    return a + b + c;
}
const curriedSum = curryWithPlaceholder(sum);
console.log(curriedSum('_', 2)(1, 3)); // 输出 6(跳过第一个参数,后续补充)

无限参数柯里化

若需支持不固定参数数量的柯里化(如累加),需明确终止条件(如无参数调用):

function infiniteCurry(fn) {
    return function curried(...args) {
        if (args.length === 0) {
            return fn();
        } else {
            return function(...nextArgs) {
                if (nextArgs.length === 0) {
                    return fn(...args);
                } else {
                    return curried(...args, ...nextArgs);
                }
            };
        }
    };
}

示例用法:

js curry实现

const add = infiniteCurry((...nums) => nums.reduce((a, b) => a + b, 0));
console.log(add(1)(2)(3)()); // 输出 6(通过空调用终止)

注意事项

  • 参数长度检查:基础柯里化依赖 fn.length,因此不适用于可变参数函数(如 (...args) => ...)。
  • 性能:每次柯里化调用会生成新函数,可能带来轻微性能开销。
  • 上下文:使用 apply 确保函数调用时的 this 正确绑定。

标签: jscurry
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…