Šī JavaScript valodas funkcija var palīdzēt sakārtot jūsu kodu un sniegs jaunu izpratni par funkciju darbību.
Curried funkcijas var palīdzēt padarīt JavaScript kodu lasāmāku un izteiksmīgāku. Karsēšanas tehnika ir ideāla, ja vēlaties sadalīt sarežģīto loģiku mazākos, autonomos, vieglāk pārvaldāmos koda gabalos.
Uzziniet visu par JavaScript funkcijām, kā izveidot funkciju currying tehniku daļēji pielietotās funkcijas, kā arī reālās dzīves izmantošanas gadījumi gan aktuālām, gan daļēji lietotām funkcijām funkcijas.
Kas ir karijs?
Kariings ir nosaukts matemātiķa Haskela B vārdā. karijs, un jēdziens izriet no Lambda skaitļiem. Kariēšana izmanto funkciju, kas saņem vairāk nekā vienu parametru, un sadala to vienkāršā (viena parametra) funkciju sērijā. Citiem vārdiem sakot, izmantotā funkcija vienlaikus aizņem tikai vienu parametru.
Karija veidošanas pamatpiemērs
Tālāk ir parādīts curry funkcijas piemērs:
functionbuildSandwich(ingredient1) {
return(ingredient2) => {
return(ingredient3) => {
return`${ingredient1},${ingredient2},${ingredient3}`
}
}
}
The buildSandwich() funkcija atgriež citu funkciju — anonīmu funkciju, kas saņem sastāvdaļa2 arguments. Pēc tam šī anonīmā funkcija atgriež citu anonīmu funkciju, kas saņem sastāvdaļa 3. Visbeidzot, šī pēdējā funkcija atgriež veidnes burtiski, veids, kā formatēt virknes JavaScript.
Tas, ko esat izveidojis, ir ligzdota funkcija, kurā katra funkcija izsauc zem tās esošo, līdz mēs sasniedzam beigas. Tagad, kad jūs zvanāt buildSandwich() un nododiet tai vienu parametru, tas atgriezīs funkcijas daļu, kuras argumenti jums vēl ir jānorāda:
console.log(buildSandwich("Bacon"))
No izvades var redzēt, ka buildSandwich atgriež funkciju:
Lai pabeigtu funkcijas izsaukumu, jums būs jāiesniedz visi trīs argumenti:
buildSandwich("Bacon")("Lettuce")("Tomato")
Šis kods nodod "Bekonu" pirmajai funkcijai, "Salātus" uz otro un "Tomātu" uz pēdējo funkciju. Citiem vārdiem sakot, buildSandwich() funkcija patiešām ir sadalīta trīs funkcijās, un katra funkcija saņem tikai vienu parametru.
Lai gan ir pilnīgi derīgi izmantot kariju, izmantojot tradicionālās funkcijas, visas ligzdas var kļūt diezgan neglītas, jo dziļāk iekļūstat. Lai to apietu, varat izmantot bultiņu funkcijas un izmantot to tīrāku sintakse:
const buildMeal = ingred1 =>ingred2 =>ingred3 =>
`${ingred1}, ${ingred2}. ${ingred3}`;
Šī pārveidotā versija ir kodolīgāka, tā ir izmantošanas priekšrocība bultiņu funkcijas salīdzinājumā ar parastajām funkcijām. Funkciju var izsaukt tāpat, kā to darījāt ar iepriekšējo:
buildMeal("Bacon")("Lettuce")("Tomato")
Daļēji pielietotās karija funkcijas
Daļēji izmantotās funkcijas ir izplatīta karija izmantošana. Šis paņēmiens nozīmē, ka vienlaikus tiek sniegti tikai nepieciešamie argumenti (nevis jāiesniedz visi argumenti). Ikreiz, kad izsaucat funkciju, nododot visus nepieciešamos parametrus, jūs sakāt, ka esat "pielietojis" šo funkciju.
Apskatīsim piemēru:
const multiply = (x, y) => x * y;
Tālāk ir parādīta multiplikācijas izstrādātā versija:
const curriedMultiply = x =>y => x * y;
The curryedMultiply() funkcija saņem x arguments pirmajai funkcijai un y otrajai funkcijai, tā reizina abas vērtības.
Lai izveidotu pirmo daļēji lietoto funkciju, zvaniet curryedMultiple() ar pirmo parametru un piešķirt atgriezto funkciju mainīgajam:
const timesTen = curriedMultiply(10)
Šobrīd kods ir "daļēji piemērots". curryedMultiply() funkciju. Tātad jebkurā laikā, kad vēlaties zvanīt reizesTen(), jums vienkārši jānodod viens skaitlis, un skaitlis tiks automātiski reizināts ar 10 (kas tiek saglabāts lietotajā funkcijā):
console.log(timesTen(8)) // 80
Tas ļauj izveidot vienu sarežģītu funkciju, no tās izveidojot vairākas pielāgotas funkcijas, katrai no kurām ir bloķēta sava funkcionalitāte.
Apskatiet piemēru, kas ir tuvāks reālam tīmekļa izstrādes lietošanas gadījumam. Zemāk jums ir a updateElemText() funkcija, kas aizņem elementu id pirmajā zvanā saturs otrajā zvanā un pēc tam atjaunina elementu, pamatojoties uz id un jūsu piegādātais saturs:
const updateElemText = id = content
=> document.querySelector(`#${id}`).textContent = content// Lock the element's id into the function:
const updateHeaderText = updateElemText('header')
// Update the header text
updateHeaderText("Hello World!")
Funkciju sastāvs ar Curried funkcijām
Vēl viena izplatīta karija izmantošana ir funkciju sastāvs. Tas ļauj izsaukt mazas funkcijas noteiktā secībā un apvienot tās vienā, sarežģītākā funkcijā.
Piemēram, hipotētiskā e-komercijas vietnē šeit ir trīs funkcijas, kuras, iespējams, vēlēsities palaist vienu pēc otras (precīzā secībā):
const addCustomer = fn =>(...args) => {
console.log("Saving customer info")
return fn(...args)
}const processOrder = fn =>(...args) => {
console.log(`processing order #${args[0]}`)
return fn(...args);
}
let completeOrder = (...args) => {
console.log(`Order #${[...args].toString()} completed.`);
}
Ņemiet vērā, ka šis kods izmanto ļaut atslēgvārds, lai definētu pabeigt pasūtījumu() funkciju. Tas ļauj atkārtoti piešķirt vērtību mainīgajam un ir daļa no kā JavaScript darbojas tvēruma noteikšana.
Pēc tam jums ir jāizsauc funkcijas apgrieztā secībā (no iekšpuses uz āru), jo vispirms vēlaties pievienot klientus:
completeOrder = (processOrder(completeOrder));
completeOrder = (addCustomer(completeOrder));
completeOrder("1000")
Tas dos jums šādu izvadi:
Ja iepriekš minētās funkcijas rakstītu parastajā veidā, kods izskatīsies apmēram šādi:
functionaddCustomer(...args) {
returnfunctionprocessOrder(...args) {
returnfunctioncompleteOrder(...args) {
// end
}
}
}
Kad jūs zvanāt uz addCustomer() funkciju un nododiet argumentus, jūs sākat no iekšpuses un virzāties uz funkcijas augšdaļu.
Pārveidojiet parasto funkciju par Curried funkciju, izmantojot karija funkciju
Ja plānojat daudz izmantot curry funkcijas, varat racionalizēt procesu, izmantojot palīgfunkciju.
Šī funkcija pārveidos jebkuru parasto funkciju par parasto funkciju. Tas izmanto rekursiju, lai apstrādātu jebkuru argumentu skaitu.
const curry = (fn) => {
return curried = (...args) => {
if (fn.length !== args.length) {
return curried.bind(null, ...args)
}
return fn(...args);
}
}
Šī funkcija pieņems jebkuru standarta rakstīto funkciju, kas saņem vairāk nekā vienu parametru, atgriežot šīs funkcijas izstrādāto versiju. Lai redzētu to darbībā, izmantojiet šo piemēra funkciju, kas ņem trīs parametrus un saskaita tos kopā:
const total = (x, y, z) => x + y + z
Lai pārvērstu šo funkciju, zvaniet uz karijs () funkcija un caurlaide Kopā kā arguments:
const curriedTotal = curry(total)
Tagad, lai izsauktu funkciju, jums vienkārši jāievada visi argumenti:
console.log(curriedTotal(10)(20)(30)) // 60
Vairāk par JavaScript funkcijām
JavaScript funkcijas ir ļoti elastīgas, un karīšanas funkcijas ir tikai neliela daļa no tā. Ir daudz citu veidu funkciju, piemēram, bultiņu funkcijas, konstruktora funkcijas un anonīmas funkcijas. Lai apgūtu JavaScript, ir svarīgi iepazīties ar šīm funkcijām un to komponentiem.