LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

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

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

你有沒(méi)有遇到過(guò)這種情況:某個(gè)函數(shù)被柯里化(Currying)了,調(diào)用方式變成了fn(a)(b)(c),但你突然想讓它變回普通的fn(a, b, c)?這時(shí)候,反柯里化就是你的救星!

1. 先說(shuō)說(shuō)柯里化是啥(復(fù)習(xí)一下)

柯里化是把一個(gè)多參數(shù)函數(shù)變成一連串單參數(shù)函數(shù)的過(guò)程。比如:

// 普通加法函數(shù)
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

柯里化好用,但有時(shí)候我們拿到一個(gè)柯里化函數(shù),卻希望它能像普通函數(shù)一樣調(diào)用。這時(shí)候就需要反柯里化

2. 反柯里化:讓函數(shù)"反悔"

反柯里化的本質(zhì)是:把一個(gè)柯里化函數(shù)還原成普通的多參數(shù)函數(shù)

舉個(gè)??,假設(shè)我寫了一個(gè)柯里化的乘法函數(shù):

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

但現(xiàn)在我想讓它能直接multiply(2, 3)調(diào)用,怎么辦?

方案1:手動(dòng)反柯里化

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

方案2:通用反柯里化函數(shù)

如果不知道函數(shù)被柯里化了幾層,可以寫一個(gè)更通用的版本:

function uncurry(fn) {
  return function(...args) {
    let currentFn = fn;
    for (const arg of args) {
      if (typeof currentFn !== 'function') {
        throw new Error('參數(shù)過(guò)多,無(wú)法繼續(xù)調(diào)用!');
      }
      currentFn = currentFn(arg);
    }
    return currentFn;
  };
}
// 測(cè)試
const curriedAddThree = a => b => c => a + b + c;
const normalAdd = uncurry(curriedAddThree);
console.log(normalAdd(1, 2, 3)); // 6 ?

3. 我踩過(guò)的坑:第三方庫(kù)的柯里化函數(shù)

去年我用一個(gè)工具庫(kù)時(shí)遇到了這個(gè)問(wèn)題。庫(kù)里的某個(gè)API是這樣的:

// 第三方庫(kù)的柯里化函數(shù)
const fetchData = (url) => (params) => (options) => {
  return fetch(url, { ...params, ...options });
};

每次調(diào)用都得寫fetchData('/api')({ id: 1 })({ timeout: 5000 }),太麻煩了!

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

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

4. 什么時(shí)候用反柯里化?

  • 適配第三方庫(kù):當(dāng)庫(kù)的API是柯里化風(fēng)格,但你想用普通調(diào)用方式時(shí)
  • 代碼重構(gòu):團(tuán)隊(duì)決定不再使用柯里化,需要批量改造舊代碼
  • 提高可讀性:某些場(chǎng)景下直接傳多個(gè)參數(shù)更直觀

5. 反柯里化的局限性

  • 參數(shù)長(zhǎng)度必須固定:如果柯里化函數(shù)允許部分應(yīng)用(如fn(a)(b)fn(a)(b)(c)混用),反柯里化會(huì)失效
  • 性能影響:多了一層函數(shù)調(diào)用,但對(duì)大多數(shù)場(chǎng)景影響微乎其微

總結(jié)

  • 柯里化是好東西,但有時(shí)候我們需要讓函數(shù)"回歸普通"
  • 反柯里化就是fn(a)(b)(c)變回fn(a, b, c)的技術(shù)
  • 特別適合處理第三方庫(kù)的柯里化API

?轉(zhuǎn)自https://juejin.cn/post/7512284328867495948


該文章在 2025/6/6 9:15:46 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲黄金精品在线观看 | 日本新一二三区不卡在线观看 | 玖玖资源综合视频在线 | 中文字幕在笑第一页 | 中文字幕日本视频高清一区 | 日本亚洲韩中文字幕 |