Vyhledávání na webu

Kdy používat curryování a částečné funkce v JavaScriptu


Četl jsem tento příspěvek na Dr. Dobb's o currying a částečných funkcích v JavaScriptu. Vypadá to užitečně, ale zajímalo by mě (jako příležitostného vývojáře v JavaScriptu), zda existují standardní situace, kdy se to běžně používá?

Odpověď č. 1

Pro začátek bych osobně nedoporučoval currying v 99 % případů. Pokud je použit nesprávně, může snadno způsobit, že bude kód nečitelné.

Nicméně některé z aplikací, které bych mohl uvést, by byly spojeny s nastavováním kontextu funkce. Například když poprvé spustíte curryovací funkci s určitým kontextem (něčím jiným než objekt window apod.), můžete mít funkci, která při pozdějším volání provádí určité výpočty na vlastnostech původního objektu apod.

Druhá situace by byla například tehdy, když máte funkci, která přijímá tři argumenty. Prvkem DOM, názvem atributu a jeho hodnotou. To by mohlo být převedeno na currying funkci, kterou byste mohli spustit s odpovídajícím prvkem, a pak by každé následující volání nastavilo atribut na hodnotu, kterou chcete. Mohlo by to být užitečné v případech, kdy máte mnoho podmínek, od kterých závisí atributy.

Odpověď č. 2

Velmi běžný scénář je při vytváření obslužných rutin událostí.

Například, řekněme, že máte dokument s mnoha odkazy, například:

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

Řekněme, že chcete, aby JavaScript procházel všechny tyto odkazy a při kliknutí zobrazil dialogové okno s hláškou „Nyní budete přesměrováni na: “. V takovém případě můžete použít kód, jako je:

    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() (který používám na window.alert()) je velmi podobný partialApply(), který se používá v článku, na který odkazujete.

I když tento příklad sám o sobě není příliš praktický, není daleko od běžnějšího úkolu: Zobrazení potvrzovacího okna, když uživatel klikne na odkaz vedoucí na web třetí strany.

Teď bychom místo window.alert.bind(...) mohli použít anonymní funkci:

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

To je ale mnohem více kódu! Většinu příkladů kurringu lze tímto způsobem „zjednodušit“, takže obvykle slouží jen jako zkratka, byť velmi užitečná.