91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

js反柯里化:讓函數“反悔”自己的特異功能,回歸普通生活!

freeflydom
2025年6月6日 9:15 本文熱度 44

你有沒有遇到過這種情況:某個函數被柯里化(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

主站蜘蛛池模板: 三级视频婷婷麻 | 91福利社 | 国产午夜一区精品 | 日本一卡亚洲精品 | 成人福利免费视频 | 区三区永久免费 | 国产在在线免费观看 | 日韩一进一 | 三区在线播放 | 欧美亚洲精品在线 | 日韩制服丝 | 韩国主播| 日韩午夜剧场人畜 | 日本遊學打 | 精品日韩一区 | 国产精选在| 日本性爱欧美精品 | 精品国产呦系 | 精品一区三区视频 | 国产永久观看在线 | 国产综合图色 | 国产午夜在线观看 | 日本理伦年轻的妻子 | 欧美亚洲精 | 国产天堂2025 | 日本欧美在线播放 | 日产无线码一区 | 欧美在线精品视频a | 97人人在线人人 | 精品露脸国 | 日韩淫片一区二区 | 三级特黄 | 日韩精品三级 | 欧美日韩另类在线 | 日韩二区在线 | 国内在线视频观看 | 成人深夜视频 | 欧美日韩午夜大片 | 另类图区亚 | 国产极品视频一区二 | 福利区体验5分钟 |