Heim >Web-Frontend >js-Tutorial >Verfassen Sie die Implementierung in der funktionalen JavaScript-Programmierung

Verfassen Sie die Implementierung in der funktionalen JavaScript-Programmierung

黄舟
黄舟Original
2017-03-02 14:49:291757Durchsuche

Im vorherigen Artikel wurde die Implementierung von javascript (Currying) in der curry funktionalen Programmierung vorgestellt. Natürlich werde ich es mit dem Currying begrenzter Parameter versuchen Gelegenheit. Diesmal spreche ich hauptsächlich über javascript eine weitere sehr wichtige Funktion in der funktionalen Programmierung compose. Die Funktion besteht darin, Funktionen zu kombinieren und in Reihe zu schalten Kombiniert mehrere Funktionen. Die Ausgabe einer Funktion ist der Eingabeparameter einer anderen Funktion. Sobald die erste Funktion ausgeführt wird, wird die Ausführung wie bei Dominosteinen abgeleitet. compose

Einführung

Wenn Sie beispielsweise eine solche Anforderung haben, müssen Sie einen Namen eingeben, der aus

, firstName besteht, und dann den Namen insgesamt ausgeben Wenn Sie beispielsweise lastName eingeben, wird jack ausgedruckt, smith. ‘HELLO,JACK SMITH’

Wir erwägen die Verwendung einer Funktionskombination, um dieses Problem zu lösen.

greetingtoUpper

Dies ist die allgemeine Verwendung von Compose Achtung Es gibt die folgenden Punkte:
var greeting = (firstName, lastName) => 'hello, ' + firstName + ' ' + lastName
var toUpper = str => str.toUpperCase()
var fn = compose(toUpper, greeting)
console.log(fn('jack', 'smith'))
// ‘HELLO,JACK SMITH’

  • s Parameter sind Funktionen, und was zurückgegeben wird, ist auch eine Funktion

    compose

  • weil Zusätzlich zu den akzeptierten Parametern der ersten Funktion sind die von anderen Funktionen akzeptierten Parameter die Rückgabewerte der vorherigen Funktion, sodass die Parameter der anfänglichen Funktion
  • sind, während die akzeptierten Werte anderer Funktionen sind

    多元一元

  • Die Funktion kann beliebige Parameter akzeptieren und die Ausführungsrichtung ist

    . Die anfängliche Funktion muss im Parameter compsoe自右向左最右面

    Kennen Sie diese drei Nach dem Klicken ist es einfach, den Ausführungsprozess des vorherigen Beispiels zu analysieren. Bei der Ausführung von
  • ist die anfängliche Funktion
wird als Parameter an

übergeben und dann fn('jack', 'smith') ausgeführt, um das Endergebnis zu erhalten. Lassen Sie mich daher kurz die Vorteile von Compose erwähnen, die Sie nicht benötigen Um greeting zu ändern, müssen Sie beispielsweise nur ein toUpper ausführen Es ist ersichtlich, dass es sehr bequem zu warten und zu erweitern ist. toUpperfnImplementierungcomposetrimNachdem ich das Beispiel im Einklang mit dem Grundprinzip analysiert habe, möchte ich noch untersuchen, wie

implementiert wird. Zuerst werde ich erklären, wie ich es implementiert habe, und dann lasst uns Erkunden Sie noch einmal, wie die beiden Hauptbibliotheken der
var trim = str => str.trim()
var newFn = compose(trim, fn)
console.log(newFn('jack', 'smith'))
funktionalen Programmierung,

und

, implementiert werden. Der Implementierungsprozess von

ist sehr funktional.

Meine ImplementierungcomposejavascriptDa die Funktion wie ein Domino ausgeführt wird, habe ich zunächst an eine Rekursion gedacht.lodash.jsZuerst:ramda.jsEine Funktion zurückgeben . Um die Ausführung der Rekursion aufzuzeichnen, notieren Sie die Länge der Parameter ramda.js und fügen Sie der zurückgegebenen Funktion einen Namen

hinzu.

Im Funktionskörper müssen die Funktionen in compose kontinuierlich ausgeführt werden und das Ausführungsergebnis der vorherigen Funktion als Eingabeparameter für den Cursor der nächsten Ausführungsfunktion verwendet werden compose wird benötigt, um die Ausführung der len-Funktionsliste aufzuzeichnen. f1

var compose = function(...args) {
    var len = args.length
    return function f1() {

    }
}
Das ist natürlich nicht möglich. Es gibt keine Exit-Bedingung, wenn die letzte Funktion ausgeführt wird, also wenn

ist >. Zu diesem Zeitpunkt ist zu beachten, dass der args-Cursor beim rekursiven Beenden in den Ausgangszustand zurückkehren muss. Fügen Sie abschließend den Code countargs

hinzu, um diese
var compose = function(...args) {
    var len = args.length
    var count = len - 1
    var result
    return function f1(...args1) {
        result = args[count].apply(this, args1)
        count--
        return f1.call(null, result)
    }
}
-Funktion zu implementieren. Später entdeckte ich, dass die Rekursion vollständig durch Iteration implementiert werden kann. Es scheint einfacher zu sein, die Funktion

zu verwenden. count0countDie Idee der Implementierung von

var compose = function(...args) {
        var len = args.length
        var count = len - 1
        var result
        return function f1(...args1) {
            result = args[count].apply(this, args1)
            if (count <= 0) {
                count = len - 1
                return result
            } else {
                count--
                return f1.call(null, result)
            }
        }
    }

ist die gleiche wie oben, aber sie wird iterativ implementiert, um einen Blick darauf zu werfen composewhilelodash.js Es ist ersichtlich, dass die ursprüngliche Implementierung von

die von

ist, aber sie bietet auch lodash von

mit einer zusätzlichen Ebene der Funktionsüberprüfung, und was empfangen wird, ist

, nicht lodash , und aus dieser Zeile

können wir ersehen, dass das Array leer sein darf, was zeigt, dass es sehr streng ist. Dem, was ich geschrieben habe, fehlte diese strenge Ausnahmebehandlung.
var flow = function(funcs) {
    var length = funcs.length
    var index = length
    while (index--) {
        if (typeof funcs[index] !== &#39;function&#39;) {
            throw new TypeError(&#39;Expected a function&#39;);
        }
    }
    return function(...args) {
        var index = 0
        var result = length ? funcs[index].apply(this, args) : args[0]
        while (++index < length) {
            result = funcs[index].call(this, result)
        }
        return result
    }
}
var flowRight = function(funcs) {
    return flow(funcs.reverse())
}

Fazitlodash从左到右Dieses Mal habe ich hauptsächlich die Prinzipien und Implementierungsmethoden der 从右到左-Funktion in der funktionalen Programmierung vorgestellt. Aus Platzgründen habe ich die von mir geplante flowRight-Quellcode-Implementierung eingefügt Um es unten zu analysieren, stellen wir es in einem Artikel vor. Man kann sagen, dass das von 数组 implementierte 参数序列 funktionaler ist und separat analysiert werden muss. var result = length ? funcs[index].apply(this, args) : args[0]

Das Obige ist der von Compose in der funktionalen JavaScript-Programmierung implementierte Inhalt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn