Heim > Artikel > Web-Frontend > Detaillierte Erläuterung der Funktionsrationalisierung in JavaScript
Verwandte Empfehlungen: „Javascript-Video-Tutorial“
Als ich kürzlich Technologie-Blogs in der Community las, sah ich versehentlich die Wörter „Funktions-Currying“ und es gab auch eine Anforderung, „JS-Funktions-Currying“ handschriftlich zu schreiben , ich frage mich, was fortgeschrittenes Currying ist? Noch nie davon gehört? Ich habe mich mit dem Problem beschäftigt, es studiert und etwas sortiert.
Was ist Function Currying? Was ist Function Currying? Werfen wir einen Blick darauf, wie Wikipedia erklärt: In der Informatik bedeutet Currying (englisch: Currying), auch übersetzt als Currying oder Currying, die Umwandlung einer Funktion, die mehrere Parameter akzeptiert, in eine Funktion, die einen einzelnen Parameter akzeptiert (ursprünglich eine Funktion, die übernimmt das erste Argument einer Funktion) und gibt eine neue Funktion zurück, die die verbleibenden Argumente akzeptiert und ein Ergebnis zurückgibt.Diese Technik wurde von Christopher Strachey nach dem Logiker Haskell Gary benannt, obwohl sie von Moses Schönfinkel und Gottlob Frege erfunden wurde.
Intuitiv heißt es beim Currying: „Wenn Sie einige Parameter festlegen, erhalten Sie eine Funktion, die die verbleibenden Parameter akzeptiert“. Wenn also für die Funktion y^x mit zwei Variablen y=2 fest ist, erhalten wir die Funktion 2^x mit einer Variablen.Wenn die Texterklärung noch etwas abstrakt ist, verwenden wir die Add-Funktion, um eine einfache Funktions-Curry-Implementierung zu erstellen.Das Konzept von Currying ist eigentlich nicht kompliziert. Einfach ausgedrückt: Übergeben Sie nur einen Teil der Parameter an die Funktion, um sie aufzurufen, und lassen Sie sie eine Funktion zurückgeben, die die restlichen Parameter verarbeitet.
// 普通的add函数 function add(x, y) { return x + y } // add函数柯里化后 var curryingAdd = function(x) { return function(y) { return x + y; }; }; // 函数复用 var increment = curryingAdd(1); var addTen = curryingAdd(10); increment(2); // 3 addTen(2); // 12Tatsächlich werden die x- und y-Parameter der Add-Funktion dahingehend geändert, dass eine Funktion zum Empfangen von x verwendet und dann eine Funktion zum Verarbeiten des y-Parameters zurückgegeben wird. Jetzt sollte die Idee klarer sein, nämlich die Funktion aufzurufen, indem nur ein Teil der Parameter übergeben wird, und sie eine Funktion zurückgeben zu lassen, die die restlichen Parameter verarbeitet. Warum müssen wir Curry-Funktionen verwenden? Nachdem ich das oben Gesagte über das Currying der Add-Funktion gelesen habe, stellt sich die Frage: Was nützt es, so viel Aufwand in die Kapselung einer Ebene zu investieren?
1. Parameter-Wiederverwendung
// 正常正则验证字符串 reg.test(txt) // 函数封装后 function check(reg, txt) { return reg.test(txt) } check(/\d+/g, 'test') //false check(/[a-z]+/g, 'test') //true // Currying后 function curryingCheck(reg) { return function(txt) { return reg.test(txt) } } var hasNumber = curryingCheck(/\d+/g) var hasLetter = curryingCheck(/[a-z]+/g) hasNumber('test1') // true hasNumber('testtest') // false hasLetter('21212') // false
Vermeiden Sie jedes Mal ein Urteil
.var on = function(element, event, handler) { if (document.addEventListener) { if (element && event && handler) { element.addEventListener(event, handler, false); } } else { if (element && event && handler) { element.attachEvent('on' + event, handler); } } } var on = (function() { if (document.addEventListener) { return function(element, event, handler) { if (element && event && handler) { element.addEventListener(event, handler, false); } }; } else { return function(element, event, handler) { if (element && event && handler) { element.attachEvent('on' + event, handler); } }; } })();
Allgemeine Kapselungsmethode:
var on = function(isSupport, element, event, handler) { isSupport = isSupport || document.addEventListener; if (isSupport) { return element.addEventListener(event, handler, false); } else { return element.attachEvent('on' + event, handler); } }Die erste ist die vorläufige Kapselung. Die vorläufigen Parameter werden durch Abschlüsse gespeichert, dann durch Abrufen der verbleibenden Argumente gespleißt und schließlich wird die Funktion ausgeführt, die Currying erfordert.
Function.prototype.bind = function (context) { var _this = this var args = Array.prototype.slice.call(arguments, 1) return function() { return _this.apply(context, args) } }
Der Zugriff auf Argumentobjekte ist normalerweise etwas langsamer als der Zugriff auf benannte Parameter.
Einige ältere Browserversionen sind bei der Implementierung von arguments.length ziemlich langsam.
Verwenden fn.apply( … ) und fn.call( … ) sind normalerweise etwas langsamer als der direkte Aufruf von fn( … )
Curried-Interview-Fragen
// 初步封装 var currying = function(fn) { // args 获取第一个方法内的全部参数 var args = Array.prototype.slice.call(arguments, 1) return function() { // 将后面方法里的全部参数和args进行合并 var newArgs = args.concat(Array.prototype.slice.call(arguments)) // 把合并后的参数通过apply作为fn的参数并执行 return fn.apply(this, newArgs) } }
Die Curry-Funktion ist sehr einfach zu bedienen und die tägliche Nutzung macht mir einfach Freude. Es ist ein unverzichtbares Werkzeug, das die funktionale Programmierung weniger umständlich und langweilig macht.
Weitere Kenntnisse zum Thema Programmierung finden Sie unter: Einführung in die Programmierung! !
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Funktionsrationalisierung in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!