Heim >Web-Frontend >js-Tutorial >Verfassen Sie die Implementierung in der funktionalen JavaScript-Programmierung
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
, firstName
besteht, und dann den Namen insgesamt ausgeben Wenn Sie beispielsweise lastName
eingeben, wird jack
ausgedruckt, smith
. ‘HELLO,JACK SMITH’
greeting
toUpper
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’
compose
多元
一元
. Die anfängliche Funktion muss im Parameter compsoe
自右向左
最右面
ü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. toUpper
fn
Implementierungcompose
trim
Nachdem ich das Beispiel im Einklang mit dem Grundprinzip analysiert habe, möchte ich noch untersuchen, wie
var trim = str => str.trim() var newFn = compose(trim, fn) console.log(newFn('jack', 'smith'))funktionalen Programmierung,
und
, implementiert werden. Der Implementierungsprozess vonMeine Implementierungcompose
javascript
Da die Funktion wie ein Domino ausgeführt wird, habe ich zunächst an eine Rekursion gedacht.lodash.js
Zuerst:ramda.js
Eine 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
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 count
args
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. count
0
count
Die 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 compose
while
lodash.js
Es ist ersichtlich, dass die ursprüngliche Implementierung von
lodash
von , nicht lodash
, und aus dieser Zeile
var flow = function(funcs) { var length = funcs.length var index = length while (index--) { if (typeof funcs[index] !== 'function') { throw new TypeError('Expected a function'); } } 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).