摘要:里也有柯里化的實(shí)現(xiàn),只是平時(shí)沒有在意。如果函數(shù)柯里化后雖然生搬硬套,不過現(xiàn)實(shí)業(yè)務(wù)也會有類似場景。
柯里化
先解釋下什么是 柯里化
在計(jì)算機(jī)科學(xué)中,柯里化(英語:Currying),又譯為卡瑞化或加里化,是把接受多個(gè)參數(shù)的函數(shù)變換成接受一個(gè)單一參數(shù)(最初函數(shù)的第一個(gè)參數(shù))的函數(shù),并且返回接受余下的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。
js 里也有柯里化的實(shí)現(xiàn),只是平時(shí)沒有在意。先把原文簡介貼出來,此文都來自于它,有興趣的可直接訪問:JavaScript 專題之函數(shù)柯里化
里面有段方法,關(guān)于柯里化函數(shù):
// https://github.com/mqyqingfeng/Blog/issues/42#issuecomment-323919896 var curry = fn => (judge = (...args) => args.length === fn.length ? fn(...args) : arg => judge(...args, arg));
設(shè)計(jì) es6 的一些特性,或許一下子很難理解,這里稍微寫的再繁瑣下:
var curry = function(fn) { /** * judge * args: 柯里化函數(shù)的參數(shù) */ return function judge() { var args = [].slice.call(arguments); // 柯里化定義的函數(shù)參數(shù) == 調(diào)用該函數(shù)的參數(shù) if (args.length >= fn.length) { return fn(...args); } else { // 通過 ()() 形式調(diào)用 -- 柯里化 return function() { var args2 = [].slice.call(arguments); // 拼接成新的參數(shù),遞歸繼續(xù)judge return judge.apply(null, args.concat(args2)); }; } }; };場景舉例
參數(shù)調(diào)用來調(diào)用去,都暈了,那到底有什么用呢?
比如:實(shí)現(xiàn)不同幅度的相加功能
var sum = function(increment, number) { return increment + number; }; // 雖然都是相同的相加邏輯,可能在函數(shù)命名、功能定義上會有不同(當(dāng)然這里只是硬性舉個(gè)例子)。 var addOne = sum; var addTen = sum; console.log(addOne(1, 5)); //6 console.log(addTen(10, 5)); //15
如果函數(shù)柯里化后:
var addOne = curry(sum)(1)(5); //6 var addTen = curry(sum)(10)(5); //15
雖然生搬硬套,不過現(xiàn)實(shí)業(yè)務(wù)也會有類似場景。這里能體會到 curry 帶來的好處:
定制化。原有共性的方法,被拆成符合不同場景的業(yè)務(wù)方法
參數(shù)明確。由于 curry 是根據(jù)固定參數(shù)約定的,所以通過()()形式固化了參數(shù)用意(比如第一個(gè)是累加數(shù),第二個(gè)是被相加數(shù))
再舉一個(gè)簡單的 Promise 實(shí)現(xiàn)舉個(gè)例子:
function MyPromise(fn) { // currying this.resolveFn = function(callback) { return callback; } this.then = function(callback) { fn(this.resolveFn(callback)); } } new MyPromise(function(resolve, reject) { setTimeout(function() { resolve(true) }, 1000) }).then(function(data) { console.log(data); })參考
我只是知識點(diǎn)的“加工者”, 更多內(nèi)容請查閱原文鏈接 , 同時(shí)感謝原作者的付出:
函數(shù)式編程入門教程
JavaScript 專題之函數(shù)柯里化
柯里化 維基百科
關(guān)于我如果你覺得這篇文章對你有幫助, 請點(diǎn)個(gè)贊或者分享給更多的道友。
也可以掃碼關(guān)注我的 微信訂閱號 - [ 前端雨爸 ], 第一時(shí)間收到技術(shù)文章 , 工作之余我會持續(xù)輸出
最后感謝閱讀, 你們的支持是我寫作的最大動力
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104672.html
摘要:函數(shù)柯里化在函數(shù)式編程中,函數(shù)是一等公民。函數(shù)柯里化的主要作用和特點(diǎn)就是參數(shù)復(fù)用提前返回和延遲執(zhí)行??赡茉趯?shí)際應(yīng)用場景中,很少使用函數(shù)柯里化的解決方案,但是了解認(rèn)識函數(shù)柯里化對自身的提升還是有幫助的。 最近在整理面試資源的時(shí)候,發(fā)現(xiàn)一道有意思的題目,所以就記錄下來。 題目 如何實(shí)現(xiàn) multi(2)(3)(4)=24? 首先來分析下這道題,實(shí)現(xiàn)一個(gè) multi 函數(shù)并依次傳入?yún)?shù)執(zhí)行,...
摘要:但是,對函數(shù)式編程而言,這個(gè)行為的重要性是毋庸置疑的。關(guān)于該模式更正式的說法是偏函數(shù)嚴(yán)格來講是一個(gè)減少函數(shù)參數(shù)個(gè)數(shù)的過程這里的參數(shù)個(gè)數(shù)指的是希望傳入的形參的數(shù)量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML 最堅(jiān)實(shí)的梁柱;分享,是...
摘要:柯里化通用式上面的柯里化函數(shù)沒涉及到高階函數(shù),也不具備通用性,無法轉(zhuǎn)換形參個(gè)數(shù)任意或未知的函數(shù),我們接下來封裝一個(gè)通用的柯里化轉(zhuǎn)換函數(shù),可以將任意函數(shù)轉(zhuǎn)換成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 閱讀原文 前言 在 JavaScript 中,柯里化和反柯里化是高階函數(shù)的一種應(yīng)用,在這之前...
摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。個(gè)人理解不知道對不對延遲執(zhí)行柯里化的另一個(gè)應(yīng)用場景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。 作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying),又稱部分求值(Partial Evalu...
摘要:引言上一節(jié)介紹了高階函數(shù)的定義,并結(jié)合實(shí)例說明了使用高階函數(shù)和不使用高階函數(shù)的情況。我們期望函數(shù)輸出,但是實(shí)際上調(diào)用柯里化函數(shù)時(shí),所以調(diào)用時(shí)就已經(jīng)執(zhí)行并輸出了,而不是理想中的返回閉包函數(shù),所以后續(xù)調(diào)用將會報(bào)錯(cuò)。引言 上一節(jié)介紹了高階函數(shù)的定義,并結(jié)合實(shí)例說明了使用高階函數(shù)和不使用高階函數(shù)的情況。后面幾部分將結(jié)合實(shí)際應(yīng)用場景介紹高階函數(shù)的應(yīng)用,本節(jié)先來聊聊函數(shù)柯里化,通過介紹其定義、比較常見的...
閱讀 3028·2021-11-24 10:21
閱讀 1598·2021-10-11 10:57
閱讀 2813·2021-09-22 15:24
閱讀 2674·2021-09-22 14:58
閱讀 2336·2019-08-30 13:16
閱讀 3487·2019-08-29 13:05
閱讀 3418·2019-08-29 12:14
閱讀 3456·2019-08-27 10:55