LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

js反柯里化:让函数“反悔”自己的特异功能,回归普通生活!

freeflydom
2025年6月6日 9:15 本文热度 37

你有没有遇到过这种情况:某个函数被柯里化(Currying)了,调用方式变成了fn(a)(b)(c),但你突然想让它变回普通的fn(a, b, c)?这时候,反柯里化就是你的救星!

1. 先说说柯里化是啥(复习一下)

柯里化是把一个多参数函数变成一连串单参数函数的过程。比如:

// 普通加法函数
function add(a, b) {
  return a + b;
}
// 柯里化版本
function curriedAdd(a) {
  return function(b) {
    return a + b;
  };
}
console.log(add(1, 2)); // 3
console.log(curriedAdd(1)(2)); // 3

柯里化好用,但有时候我们拿到一个柯里化函数,却希望它能像普通函数一样调用。这时候就需要反柯里化

2. 反柯里化:让函数"反悔"

反柯里化的本质是:把一个柯里化函数还原成普通的多参数函数

举个🌰,假设我写了一个柯里化的乘法函数:

function curriedMultiply(a) {
  return function(b) {
    return a * b;
  };
}
const multiply = curriedMultiply;

但现在我想让它能直接multiply(2, 3)调用,怎么办?

方案1:手动反柯里化

function uncurry(fn) {
  return function(a, b) {
    return fn(a)(b);
  };
}
const normalMultiply = uncurry(curriedMultiply);
console.log(normalMultiply(2, 3)); // 6 ✅

方案2:通用反柯里化函数

如果不知道函数被柯里化了几层,可以写一个更通用的版本:

function uncurry(fn) {
  return function(...args) {
    let currentFn = fn;
    for (const arg of args) {
      if (typeof currentFn !== 'function') {
        throw new Error('参数过多,无法继续调用!');
      }
      currentFn = currentFn(arg);
    }
    return currentFn;
  };
}
// 测试
const curriedAddThree = a => b => c => a + b + c;
const normalAdd = uncurry(curriedAddThree);
console.log(normalAdd(1, 2, 3)); // 6 ✅

3. 我踩过的坑:第三方库的柯里化函数

去年我用一个工具库时遇到了这个问题。库里的某个API是这样的:

// 第三方库的柯里化函数
const fetchData = (url) => (params) => (options) => {
  return fetch(url, { ...params, ...options });
};

每次调用都得写fetchData('/api')({ id: 1 })({ timeout: 5000 }),太麻烦了!

于是我祭出反柯里化大法:

const normalFetchData = uncurry(fetchData);
normalFetchData('/api', { id: 1 }, { timeout: 5000 }); // 清爽! 🎉

4. 什么时候用反柯里化?

  • 适配第三方库:当库的API是柯里化风格,但你想用普通调用方式时
  • 代码重构:团队决定不再使用柯里化,需要批量改造旧代码
  • 提高可读性:某些场景下直接传多个参数更直观

5. 反柯里化的局限性

  • 参数长度必须固定:如果柯里化函数允许部分应用(如fn(a)(b)fn(a)(b)(c)混用),反柯里化会失效
  • 性能影响:多了一层函数调用,但对大多数场景影响微乎其微

总结

  • 柯里化是好东西,但有时候我们需要让函数"回归普通"
  • 反柯里化就是fn(a)(b)(c)变回fn(a, b, c)的技术
  • 特别适合处理第三方库的柯里化API

​转自https://juejin.cn/post/7512284328867495948


该文章在 2025/6/6 9:15:46 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved