Milloin käyttää currya ja osittaisia funktioita JavaScriptissä


Luin tämän kirjoituksen Dr. Dobb'sista currying- ja osittaisfunktioista JavaScriptissä. Se vaikuttaa hyödylliseltä, mutta mietin (JavaScriptin satunnaisena kehittäjänä), onko olemassa vakioidettuja tilanteita, joissa tätä käytetään säännöllisesti?

Vastaus #1

Aluksi, henkilökohtaisesti en suosittelisi curryaamista 99 % tapauksissa. Sitä voi helposti käyttää koodin lukukelvottomaksi, jos sitä käytetään väärin.

Kuitenkin joihinkin sovelluksiin, joita voisin nimetä, liittyisi funktion kontekstin asettamiseen. Esimerkiksi kun suoritat ensimmäistä kertaa currytymisfunktion kontekstilla (jokin muu kuin ikkunan objekti jne.), sinulla voisi olla funktio, joka suorittaa tiettyjä laskelmia alkuperäisen objektin ominaisuuksille ja niin edelleen, kun sitä kutsutaan myöhemmin.

Toinen tilanne olisi esimerkiksi silloin, kun sinulla on funktio, joka ottaa kolme argumenttia. DOM-elementti, attribuutin nimi ja sen arvo. Tämä voitaisiin muuttaa currying-funktioksi, jonka voisit käynnistää sopivalla elementillä ja sitten jokainen seuraava suoritus asettaisi attribuutin haluamaasi arvoon. Voi olla hyödyllistä tapauksissa, joissa sinulla on lukuisia ehtoja, joista attribuutit riippuvat.

Vastaus #2

Hyvin yleinen tilanne on tapahtumankäsittelijöiden luomisessa.

Esimerkiksi, sanotaan, että sinulla on asiakirja, jossa on paljon linkkejä, kuten:

    <a href="http://someurl.com/example">link</a>

Sanot, että haluat JavaScriptin käydä läpi ja saada kaikki nämä linkit näyttämään "Olet nyt siirtymässä: <link_url>"-valintaikkunan klikkauksen yhteydessä. Tällöin voit käyttää esimerkiksi seuraavanlaista koodia:

    var links = document.getElementsByTagName("a"), len = links.length;
    for (var n = 0; n < len; ++n) {
        links[n].onclick = window.alert.bind(null, "You are now going to: " + links[n].innerText);
    }

Function.prototype.bind() (jonka käytän window.alert():ssa) on hyvin samanlainen kuin partialApply(), jota käytetään artikkelissa, johon linkität.

Vaikka tämä esimerkki itsessään ei ole kovin käytännöllinen, se ei ole kaukana tavallisemman tehtävän luonteesta: Näyttää vahvistusruutu, kun käyttäjä klikkaa linkkiä, joka johtaa kolmannen osapuolen verkkosivustolle.

Nyt, window.alert.bind(...) sijaan, voisimme käyttää nimettömän funktion:

    links[n].onclick = (function(text) {
        return function() { window.alert(text); };
    })("You are now going to: " + link[n].innerText);

Kuitenkin se on paljon enemmän koodia! Useimmat esimerkit curryn käytöstä voidaan "yksinkertaistaa" tällä tavalla, joten se yleensä toimii vain pikanäppäimenä, vaikkakin erittäin kätevänä sellaisena.