JavaScript中的偏函數(shù)你理解了嗎
是什么
JavaScript中的偏函數(shù)(Partial Function)是指一個(gè)函數(shù),它是由另一個(gè)函數(shù)通過固定一些參數(shù)而得到的,從而產(chǎn)生了一個(gè)新的函數(shù)。這個(gè)新函數(shù)的功能和原函數(shù)一樣,只是在調(diào)用時(shí)需要傳入的參數(shù)比原函數(shù)更少。
偏函數(shù)的作用和優(yōu)點(diǎn)
偏函數(shù)的作用是創(chuàng)建一個(gè)新的函數(shù),該函數(shù)固定了原函數(shù)的部分參數(shù),使得在調(diào)用新函數(shù)時(shí)只需要提供剩余的參數(shù)即可。偏函數(shù)的優(yōu)點(diǎn)在于:
- 可以減少重復(fù)代碼。在某些場(chǎng)景下,多個(gè)函數(shù)的參數(shù)有一些相同的部分,使用偏函數(shù)可以將這些共同的部分提取出來,避免在多個(gè)函數(shù)中重復(fù)寫相同的代碼。
- 可以使代碼更加模塊化。偏函數(shù)可以將一個(gè)大函數(shù)拆分成多個(gè)小函數(shù),每個(gè)小函數(shù)只負(fù)責(zé)一部分參數(shù)的處理,使得代碼更加清晰、易于維護(hù)。
- 可以方便地實(shí)現(xiàn)柯里化。偏函數(shù)是柯里化的一種特殊形式,它可以為柯里化提供一個(gè)簡(jiǎn)單、快速的實(shí)現(xiàn)方式。
舉例
假設(shè)我們正在編寫一個(gè)Web應(yīng)用,其中有多個(gè)按鈕需要監(jiān)聽click事件。每個(gè)按鈕的click事件處理函數(shù)都需要執(zhí)行一些相同的操作(例如發(fā)送AJAX請(qǐng)求),但也有一些不同的參數(shù)需要傳遞(例如不同的URL)。在這種情況下,我們可以使用偏函數(shù)來創(chuàng)建一個(gè)新的函數(shù),該函數(shù)固定了相同的部分參數(shù)(例如發(fā)送AJAX請(qǐng)求的函數(shù)),并將不同的部分參數(shù)(例如URL)作為調(diào)用時(shí)的參數(shù)。這樣,我們可以避免在每個(gè)按鈕的click事件處理函數(shù)中重復(fù)編寫發(fā)送AJAX請(qǐng)求的代碼。同時(shí),我們也可以將發(fā)送AJAX請(qǐng)求的函數(shù)作為一個(gè)單獨(dú)的模塊,以便在其他地方復(fù)用。
假設(shè)我們有一個(gè)函數(shù)roundToTwoDecimals,用于將數(shù)字四舍五入到兩個(gè)小數(shù)位?,F(xiàn)在我們想要使用這個(gè)函數(shù)來將一個(gè)數(shù)組中的所有元素都四舍五入到兩個(gè)小數(shù)位,并將結(jié)果保存在一個(gè)新的數(shù)組中。
我們可以使用Array.prototype.map方法來實(shí)現(xiàn)這個(gè)功能,如下所示:
function roundToTwoDecimals(num) { return Math.round(num * 100) / 100; } const numbers = [1.234, 2.345, 3.456]; const roundedNumbers = numbers.map(roundToTwoDecimals); console.log(roundedNumbers); // 輸出[1.23, 2.35, 3.46]
這段代碼可以正常工作,但在每次調(diào)用map方法時(shí),我們都需要手動(dòng)傳遞roundToTwoDecimals函數(shù)。如果我們?cè)诖a中多次使用這個(gè)函數(shù),這會(huì)導(dǎo)致代碼的重復(fù)和冗余。
通過使用偏函數(shù),我們可以將roundToTwoDecimals函數(shù)轉(zhuǎn)換為一個(gè)新函數(shù),該函數(shù)接受一個(gè)參數(shù),并將該參數(shù)傳遞給roundToTwoDecimals函數(shù)。然后我們可以將這個(gè)新函數(shù)作為參數(shù)傳遞給map方法,從而簡(jiǎn)化代碼。代碼如下所示:
function roundToTwoDecimals(num, precision) { precision = 10 ** precision; return Math.round(num * precision) / precision; } const numbers = [1.234, 2.345, 3.456]; const round = (fn, precision) => (value) => fn(value, precision); const roundToTwoDecimalsPartial = round(roundToTwoDecimals, 2); const roundedNumbers = numbers.map(roundToTwoDecimalsPartial); console.log(roundedNumbers); // 輸出[1.23, 2.35, 3.46]
在這個(gè)例子中,我們定義了一個(gè)round函數(shù),它接受兩個(gè)參數(shù):一個(gè)函數(shù)fn和一個(gè)精度precision。round函數(shù)返回一個(gè)新函數(shù),該函數(shù)接受一個(gè)值value,并將fn函數(shù)應(yīng)用于該值和精度參數(shù)。然后,我們使用round函數(shù)來創(chuàng)建一個(gè)新函數(shù)roundToTwoDecimalsPartial,該函數(shù)將roundToTwoDecimals函數(shù)綁定到精度2上。最后,我們將這個(gè)新函數(shù)傳遞給map方法,從而將數(shù)組中的每個(gè)元素都四舍五入到兩個(gè)小數(shù)位。
面試題
請(qǐng)編寫一個(gè)函數(shù)compose,接受任意數(shù)量的函數(shù),并返回一個(gè)新函數(shù),該新函數(shù)將它們組合成一個(gè)新函數(shù),從右到左執(zhí)行。例如:
const add = (a, b) => a + b; const double = (x) => x * 2; const square = (x) => x * x; const composedFn = compose(square, double, add); composedFn(1, 2); // 36
這里提供一個(gè)基于ES6語法的實(shí)現(xiàn),代碼如下:
const compose = (...fns) => { return (...args) => { return fns.reduceRight((result, fn) => { return fn(result); }, ...args); }; };
這個(gè)實(shí)現(xiàn)基于函數(shù)式編程的思想,通過將多個(gè)函數(shù)組合成一個(gè)新函數(shù),使得代碼更加簡(jiǎn)潔、易于閱讀和維護(hù)。實(shí)現(xiàn)過程如下:
- 函數(shù)compose接受任意數(shù)量的函數(shù)fns作為參數(shù),并返回一個(gè)新函數(shù)。
- 這個(gè)新函數(shù)接受任意數(shù)量的參數(shù)args作為參數(shù),并將它們傳遞給最右邊的函數(shù)。
- 新函數(shù)使用reduceRight方法從右到左依次執(zhí)行fns中的函數(shù),將每個(gè)函數(shù)的結(jié)果作為下一個(gè)函數(shù)的參數(shù),最終返回整個(gè)函數(shù)鏈的結(jié)果。
這個(gè)實(shí)現(xiàn)具有一定的公用性,可以用于任意數(shù)量的函數(shù)組合。例如,假設(shè)我們有三個(gè)函數(shù)add、double和square,它們分別表示加法、乘以2和平方運(yùn)算。我們可以使用compose將它們組合成一個(gè)新函數(shù),如下所示:
const add = (a, b) => a + b; const double = (x) => x * 2; const square = (x) => x * x; const composedFn = compose(square, double, add); console.log(composedFn(1, 2)); // 輸出 36
這里,composedFn表示add、double和square這三個(gè)函數(shù)組合起來的新函數(shù)。我們調(diào)用composedFn(1, 2) 時(shí),先將1和2作為參數(shù)傳遞給add函數(shù),得到結(jié)果3;然后將3作為參數(shù)傳遞給double函數(shù),得到結(jié)果6;最后將6作為參數(shù)傳遞給square函數(shù),得到結(jié)果36,這就是整個(gè)函數(shù)鏈的最終結(jié)果。
到此這篇關(guān)于JavaScript中的偏函數(shù)你理解了嗎的文章就介紹到這了,更多相關(guān)JavaScript偏函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
動(dòng)態(tài)加載dtree.js樹treeview(示例代碼)
本篇文章主要是對(duì)動(dòng)態(tài)加載dtree.js樹treeview的示例代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12js監(jiān)聽input輸入框值的實(shí)時(shí)變化實(shí)例
下面小編就為大家?guī)硪黄猨s監(jiān)聽input輸入框值的實(shí)時(shí)變化實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01layui實(shí)現(xiàn)tab的添加拒絕重復(fù)的方法
今天小編就為大家分享一篇layui實(shí)現(xiàn)tab的添加拒絕重復(fù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09javascript實(shí)現(xiàn)輪顯新聞標(biāo)題鏈接
這篇文章主要介紹了javascript實(shí)現(xiàn)輪顯新聞標(biāo)題鏈接的相關(guān)資料,需要的朋友可以參考下2007-08-08小程序中實(shí)現(xiàn)自定義頭部導(dǎo)航組件的詳細(xì)過程
這篇文章主要介紹了小程序中實(shí)現(xiàn)自定義頭部導(dǎo)航組件的詳細(xì)過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06JavaScript表格隔行變色和Tab標(biāo)簽頁特效示例【附j(luò)Query版】
這篇文章主要介紹了JavaScript表格隔行變色和Tab標(biāo)簽頁特效,結(jié)合實(shí)例形式分析了javascript元素遍歷、事件響應(yīng)相關(guān)操作技巧,并附帶jQuery對(duì)應(yīng)實(shí)現(xiàn)代碼供大家參考,需要的朋友可以參考下2019-07-07JS獲取當(dāng)前網(wǎng)頁大小以及屏幕分辨率等
這篇文章主要介紹了JS獲取當(dāng)前網(wǎng)頁大小以及屏幕分辨率等,方法雖簡(jiǎn)單,但比較實(shí)用,需要的朋友可以參考下2014-09-09