JavaScript Academy · Oppitunti

Funktioiden currytys

Muuntaa usean argumentin funktioita ketjuiksi.

Oppitunti 2/413 vaihetta

Funktioiden currytys on ilmainen JavaScript Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu JavaScript Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.

Mitä curryointi on

Curryointi muuntaa useita argumentteja vastaanottavan funktion funktioiden ketjuksi, jossa kukin funktio vastaanottaa yhden argumentin.

Sen sijaan että kutsuisitte add(1, 2, 3), kutsutte add(1)(2)(3). Jokainen kutsu palauttaa seuraavan funktion, kunnes kaikki argumentit on kerätty.

Curryointi käsin

Selkein tapa nähdä curryointi käytännössä on kirjoittaa sisäkkäisiä funktioita, joista kukin palauttaa seuraavan funktion ja muodostaa sulkeuman aiemmin annettuihin argumentteihin.

function add(a) {
  return function (b) {
    return function (c) {
      return a + b + c;
    };
  };
}

console.log(add(1)(2)(3));

Sisäkkäiset nuolifunktiot

Nuolifunktiot lyhentävät curryotujen funktioiden määrittelyjä. Jokainen => palauttaa seuraavan nuolifunktion, ja viimeinen suorittaa varsinaisen työn.

const add = a => b => c => a + b + c;

console.log(add(1)(2)(3));
console.log(add(10)(20)(30));

Sulkeumat muistavat argumentit

Curryointi perustuu sulkeumiin. Jokainen palautettu funktio säilyttää viittauksen ulomman näkyvyysalueensa muuttujiin, joten aiemmat argumentit pysyvät käytettävissä viimeisen kutsun suorittamiseen asti.

const greet = greeting => name => greeting + ', ' + name + '!';

const sayHi = greet('Hi');
console.log(sayHi('Ada'));
console.log(sayHi('Grace'));

Kutsuminen vaiheittain

Kaikkia argumentteja ei tarvitse soveltaa kerralla. Voitte pysähtyä puolivälissä ja tallentaa osittaisen tuloksen muuttujaan myöhempää uudelleenkäyttöä varten.

const add = a => b => c => a + b + c;

const addOne = add(1);
const addOneAndTwo = addOne(2);

console.log(addOneAndTwo(3));
console.log(addOneAndTwo(100));

Yleiskäyttöinen curry-apufunktio

Sisäkkäisten funktioiden kirjoittaminen käsin on työlästä. Yleiskäyttöinen curry-apufunktio kerää argumentteja, kunnes niitä on riittävästi, ja kutsuu sitten alkuperäistä funktiota.

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    }
    return (...more) => curried(...args, ...more);
  };
}

const add = curry((a, b, c) => a + b + c);
console.log(add(1)(2)(3));

Joustavat kutsut curryn avulla

Hyvä curry-apufunktio hyväksyy argumentit missä tahansa ryhmittelyssä. fn.length kertoo sille, kuinka monta parametria alkuperäinen funktio määritteli.

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    }
    return (...more) => curried(...args, ...more);
  };
}

const add = curry((a, b, c) => a + b + c);
console.log(add(1, 2, 3));
console.log(add(1, 2)(3));
console.log(add(1)(2, 3));

Currying erikoistamista varten

Currying tekee erikoistamisesta luontevaa: välittäkää ensimmäinen argumentti ja käyttäkää palautettua funktiota uudelleen useissa kutsuissa.

const multiply = a => b => a * b;

const double = multiply(2);
const triple = multiply(3);

console.log(double(5));
console.log(triple(5));

Currying taulukkometodien kanssa

Currytetyt funktiot sopivat täydellisesti map- ja filter-metodeihin, koska kumpikin tuottaa yksittäisen argumentin funktion, joka on valmis vastaanottamaan kunkin alkion.

const greaterThan = min => value => value > min;

const over10 = greaterThan(10);
console.log([5, 12, 8, 20].filter(over10));

Currying ja osittainen soveltaminen

Osittainen soveltaminen kiinnittää jotkin argumentit ja jättää loput välitettäviksi yhdessä myöhemmässä kutsussa. Currying jakaa funktion aina yksittäisten argumenttien kutsuketjuksi.

Currying on yksi erityinen, täysin hajotettu osittaisen soveltamisen muoto.

const partial = (a, b) => c => a + b + c;
const curried = a => b => c => a + b + c;

console.log(partial(1, 2)(3));
console.log(curried(1)(2)(3));

Miksi currytys?

Currying kannustaa kirjoittamaan pieniä, yhdisteltäviä ja uudelleenkäytettäviä funktioita. Se sopii luontevasti yhteen funktioiden koostamisen kanssa, jota käsittelette seuraavaksi. Keskeinen ajatus on, että currytetty funktio ei ole koskaan ”keskeneräinen”, vaan se palauttaa yksinkertaisesti uuden funktion, kunnes kaikki tarvittavat argumentit on annettu.

const tag = name => content => '<' + name + '>' + content + '</' + name + '>';

const bold = tag('b');
console.log(bold('important'));
console.log(tag('i')('slanted'));

Pikatarkistus

Kun const add = a => b => c => a + b + c;, minkä arvon add(1)(2) tuottaa?

Kertaus: currying

Opitte hajottamaan funktioita yksittäisten argumenttien kutsuketjuiksi:

  • Currytetyt funktiot palauttavat uuden funktion jokaista argumenttia kohden sulkeumien avulla.
  • Sisäkkäiset nuolifunktiot mahdollistavat tiiviit currytetyt määrittelyt.
  • Yleinen curry-apufunktio käyttää fn.length-arvoa tietääkseen, milloin argumentteja on saatu riittävästi.
  • Currying mahdollistaa selkeän erikoistamisen ja koostamisen.
Aloita maksutta

Opi JavaScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
59
Oppitunnit
200

Usein kysytyt kysymykset

Onko oppitunti ”Funktioiden currytys” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa JavaScript Academy-oppimispolun 3 oppituntia, myös oppitunnin “Funktioiden currytys”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. JavaScript Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Funktioiden currytys”?

Muuntaa usean argumentin funktioita ketjuiksi. Harjoittelet JavaScript Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni JavaScript Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin JavaScript Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Funktioiden currytys”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä JavaScript Academy-oppitunnilla?

Kyllä. Jokainen JavaScript Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Osittainen soveltaminen
  2. Funktioiden currytys
  3. Funktioiden koostaminen
  4. pipen ja composin rakentaminen
← Takaisin: JavaScript Academy