Argumente an Javascript-Funktionen anhängen, anstatt sie vorzufügen (Function.prototype.bind)

8

In Javascript (Node.js-Kontext) verwende ich Function.prototype.bind regelmäßig: bind ermöglicht das Ändern des Aufrufkontexts und optional das Bereitstellen zusätzlicher vorangestellter Argumente.

Gibt es Empfehlungen für Anhängen Argumente? Bei einigen Gelegenheiten bin ich auf die Notwendigkeit gestoßen, in Node.js eher anzuhängen als vorzugeben, damit ich das Funktionssignaturmuster einhalten kann.

Nun zu einem halb praktischen und vereinfachten Beispiel; Ich verwende die eachSeries Methode asynchronen Moduls .

Zuerst eine Implementierung, die den Callback umschließt (funktionierend, aber weit weg):

%Vor%

Und jetzt etwas kürzer:

%Vor%

Im zweiten Beispiel wird err von eachSeries s asyncCallback Callback übernommen, während something auf andere Weise zur Verfügung gestellt wird. Um dies zu verdeutlichen, möchte ich bindAppend von dem "kürzeren" Beispiel ersetzen, das das funktionale Äquivalent von function finished im "längeren" Beispiel hätte.

Vielleicht ist mein Design fehlerhaft und muss überarbeitet werden oder dies ist nur ein weiterer Fall einer vorzeitigen Optimierung. Die Funktion, die ich suche, könnte jedoch die folgenden Vorteile bieten:

  1. vereinfachter Code in Bezug auf Lesbarkeit IMO
  2. verringerte und vereinfachte Stapeltiefe

Eine Antwort wäre, meine eigene aus einem gegabelten Function.prototype.bind Polyfill zu rollen. Ich suche jedoch nach einer nativen Implementierung, die ich nicht sehe, nach einer nativen Umgebung oder nach einem Utility-Modul, das die harte Arbeit bereits erledigt hat (Optimierung, Tests usw.). Zu Ihrer Information: Eine andere Lösung als die erstgenannte würde tatsächlich den Merkmalsvorteil Nr. 2 verschlechtern.

    
zamnuts 30.04.2014, 06:48
quelle

4 Antworten

9

Angenommen, ich habe die Frage verstanden, mein erster Versuch mit Tests:

%Vor%

Test:

%Vor%

Arbeitsversion: Ссылка

    
mpm 15.05.2014, 06:14
quelle
2

Es gibt keine nativen Lösungen. Aber ich kann dir so etwas vorschlagen:

%Vor%

Und Verwendung:

%Vor%

Anderes Beispiel:

%Vor%     
3y3 15.05.2014 13:32
quelle
2

Aus Gründen der Wartbarkeit würde ich zu Function keine Methode hinzufügen, um dies zu erreichen. Die anderen Antworten auf die Frage enthalten zwei Implementierungen von Function.prototype.bindAppend , die nicht miteinander kompatibel sind. Stellen Sie sich vor, Sie würden Ihr eigenes bindAppend erstellen und dann Ihre Anwendung mit einer Menge Code verwenden, dessen Autor sich dazu entschieden hat, dasselbe zu tun, aber eine Implementierung verwendet, die mit Ihrer nicht kompatibel ist.

Polyfills sind insofern gut, als sie darauf abzielen, eine fehlende Funktion nach einem bestimmten Standard auszufüllen. Ein Polyfill für Function.prototype.bind zum Beispiel kann nicht frei von ECMA-262, 5. Ausgabe, abweichen. Wenn es abweicht, dann ist es wohl "fehlerhaft" und sollte durch eine Implementierung ersetzt werden, die nicht vom Standard abweicht. Wenn man Methoden implementiert, die nicht durch einen Standard definiert sind, gibt es keine solche Einschränkung.

Die folgende Benchmarking-Suite zeigt den Unterschied zwischen verschiedenen Möglichkeiten, das Ergebnis in der Frage zu erreichen.

%Vor%

Ausgabe:

%Vor%

Anmerkungen:

  • Der Aufruf von dump dump zeigt an, was der letzte Callback ist, wenn kein Fehler auftritt.

  • Wenn es keinen Fehler gibt, ruft mpm% bindAppend implementation callback mit nur einem Parameter auf, der den Wert "foo" hat. Dies ist ein sehr unterschiedliches Verhalten gegenüber dem ursprünglichen function finished(err) { callback(err,something);} Callback, den es ersetzen soll.

  • Alles ist schneller als mpm's bindAppend .

  • Ich würde die addErr, multi param Implementierung nicht verwenden. Ich habe es dort hingelegt, um zu prüfen, wie dieser Ansatz funktioniert.

  • Die Funktionen addErr sind schneller als bindAppend , auf Kosten der Flexibilität. Sie fügen dem Rückruf nur einen Parameter hinzu.

Am Ende des Tages würde ich höchstwahrscheinlich die addErr, switch -Implementierung mit einer ausreichend großen Anzahl von Fällen verwenden, um die Anforderungen meines Codes zu erfüllen. Wenn ich etwas mit absoluter Flexibilität benötige, würde ich für einige wenige Fälle etwas verwenden, das ähnlich wie bindAppend ist, aber nicht als Methode für Function .

    
Louis 21.05.2014 00:17
quelle
0

lodash _.partial erlaubt das Anhängen von Argumenten ..

Ссылка

%Vor%     
shunryu111 31.05.2017 12:07
quelle

Tags und Links