Im Gegenteil besteht die Rolle von Anti-Currying darin, die Anwendbarkeit von Funktionen zu erweitern, sodass Funktionen, die ursprünglich Funktionen sind, die einem bestimmten Objekt gehören, möglich sind Wird von jedem Objekt verwendet. Das verwendete .
dient dazu, die unten angegebene Funktionssignatur
obj.func(arg1, arg2)
in eine Funktion umzuwandeln Formular mit folgender Signatur:
func(obj, arg1, arg2)
Dies ist die formale Beschreibung des Decurrying.
Zum Beispiel eine einfache Implementierung des Folgenden:
Function.prototype.uncurrying = function() { var that = this; return function() { return Function.prototype.call.apply(that, arguments); } };function sayHi () { return "Hello " + this.value +" "+[].slice.call(arguments); }var sayHiuncurrying=sayHi.uncurrying(); console.log(sayHiuncurrying({value:'world'},"hahaha"));
Erklärung:
uncurrying ist eine Methode, die im Prototyp von Function definiert ist, sodass diese Methode für alle Funktionen verwendet werden kann. Beim Aufruf: sayHiuncurrying=sayHi.uncurrying(), also zeigt dies in uncurrying auf die sayHi-Funktion (im Allgemeinen zeigt dies in der Prototyp-Methode nicht auf den Prototyp-Objekt-Prototyp, sondern auf das aufrufende Objekt, wobei das aufrufende Objekt ein anderes ist Funktion. Funktionen sind auch Objekte in Javascript)
call.apply(that, arguments) Legen Sie dies als Kontext der Aufrufmethode fest und übergeben Sie dann Argumente an Die Aufrufmethode zeigt im vorherigen Beispiel tatsächlich auf sayHi, sodass der Aufruf von sayHiuncurrying(arg1, arg2, ...) äquivalent zu sayHi.call(arg1, arg2, ...);
var uncurrying= function (fn) { return function () { var args=[].slice.call(arguments,1); return fn.apply(arguments[0],args); } };
Bei Verwendung wird uncurrying aufgerufen und eine vorhandene Funktion fn übergeben. Die decurrying-Funktion gibt eine neue Funktion zurück. Der erste von der neuen Funktion akzeptierte Parameter wird an den Kontext dieser Funktion in fn gebunden Als Argument an fn übergeben.
Uncurrying wird also häufiger verwendet, um andere in Javascript integrierte Methoden auszuleihen, ohne sie alle selbst implementieren zu müssen.
Die Textbeschreibung ist etwas kompliziert, also schauen wir uns den Code weiter an:
var test="a,b,c"; console.log(test.split(","));var split=uncurrying(String.prototype.split); //[ 'a', 'b', 'c' ]console.log(split(test,',')); //[ 'a', 'b', 'c' ]
Sehen Sie sich ein anderes Beispiel an:
var $ = {}; console.log($.push); // undefinedvar pushUncurrying = uncurrying(Array.prototype.push); $.push = function (obj) { pushUncurrying(this,obj); }; $.push('first'); console.log($.length); // 1console.log($[0]); // firstconsole.log($.hasOwnProperty('length')); // true
jqueryLibrary“ leiht sich bei der Implementierung die Push-Methode von Array aus. Wir wissen, dass Objekte keine Push-Methode haben, daher gibt console.log(obj.push) ein undefiniertes Array zurück. Die native Array-Methode (JS-Engine) behält das Längenattribut
des Pseudo-Arrays bei. Array-Objekt
Aus dem gleichen Grund können wir weiterhin:
var indexof=uncurrying(Array.prototype.indexOf); $.indexOf = function (obj) { return indexof(this,obj); }; $.push("second"); console.log($.indexOf('first')); // 0console.log($.indexOf('second')); // 1console.log($.indexOf('third')); // -1
Wir können auch die Methode Function.prototype.call/apply entsperren, zum Beispiel:
var call= uncurrying(Function.prototype.call);var fn= function (str) { console.log(this.value+str); };var obj={value:"Foo "}; call(fn, obj,"Bar!"); // Foo Bar!
Der Angriff der allgemeinen Uncurrying-Funktion
Erstens: Wenn das B-Raster höher ist, kann Uncurrying auch so geschrieben werden:
Wenn Sie das B-Raster natürlich noch verbessern müssen, können Sie dies natürlich immer noch tun. Es kann so sein:
var uncurrying= function (fn) { return function () { var context=[].shift.call(arguments); return fn.apply(context,arguments); } };
Das obige ist der detaillierte Inhalt vonAnti-Currying in JS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!