Da ich neugierig war, aber immer noch keine Antwort auf das Leistungsthema der obigen Frage finden konnte, schrieb ich diesen Kern für nodejs, um sowohl die Leistung als auch die Zuverlässigkeit aller vorgestellten (und bewerteten) Lösungen zu testen.
Ich habe die Wandzeiten einer Klonfunktionserstellung und die Ausführung eines Klons verglichen. Die Ergebnisse zusammen mit Assertionsfehlern sind im Kernkommentar enthalten.
Plus meine zwei Cent (basierend auf dem Vorschlag des Autors):
clone0 cent (schneller aber hässlicher):
Function.prototype.clone = function() {
var newfun;
eval('newfun=' + this.toString());
for (var key in this)
newfun[key] = this[key];
return newfun;
};
clone4 cent (langsamer, aber für diejenigen, die eval () nicht für Zwecke mögen, die nur ihnen und ihren Vorfahren bekannt sind):
Function.prototype.clone = function() {
var newfun = new Function('return ' + this.toString())();
for (var key in this)
newfun[key] = this[key];
return newfun;
};
Wenn eval / new Function langsamer als die Wrapper-Lösung ist (und dies hängt wirklich von der Größe des Funktionskörpers ab), erhalten Sie einen nackten Funktionsklon (und ich meine den echten flachen Klon mit Eigenschaften, aber nicht gemeinsam genutztem Zustand) ohne unnötigen Fuzz mit versteckten Eigenschaften, Wrapper-Funktionen und Problemen mit dem Stack.
Außerdem gibt es immer einen wichtigen Faktor, den Sie berücksichtigen müssen: Je weniger Code, desto weniger Fehlerstellen.
Der Nachteil der Verwendung der eval / new-Funktion besteht darin, dass der Klon und die ursprüngliche Funktion in unterschiedlichen Bereichen ausgeführt werden. Es funktioniert nicht gut mit Funktionen, die Gültigkeitsbereichsvariablen verwenden. Die Lösungen, die bind-like Wrapping verwenden, sind unabhängig vom Bereich.