Heim > Artikel > Web-Frontend > Lustige Frage zu JavaScript: Funktionsklonen
Wie klone ich eine Funktion in JavaScript?
Mit anderen Worten, wie kann man die Parameterliste und den Funktionskörper einer Funktion in eine neue Funktion klonen?
Wenn es beispielsweise eine solche Function.prototype.clone-Methode gibt, wird sie zum Klonen einer Funktion verwendet. Die Verwendung ist wie folgt:
var original = function original_name(a, b) { return a + b; }; var cloned = original.clone(); alert(cloned == original); //false
Die neue Funktion ist eine vollständig Neues Objekt, es hat seinen eigenen Bereich, aber seine Verwendung ist genau die gleiche wie die ursprüngliche Funktion.
Zuallererst werden Sie sicher daran denken, dass Eval ein Teufel mit großen magischen Kräften ist.
Es sind nur wenige Codezeilen erforderlich, um diese Anforderung zu erfüllen:
Function.prototype.clone = function(){ var func; eval("func = " + this.toString()); return func; };
Da eval funktionieren kann, kann seine Bruderfunktion dies definitiv auch:
Function.prototype.clone = function(){ return new Function("return " + this.toString())(); };
Diese Codezeile ist noch prägnanter, aber die Änderung der Verwendung von Function ist keine neue Lösung:
String.prototype.trim = function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); }; Function.prototype.clone = function() { var findArgs = function(funcStr){ var bracket1 = funcStr.indexOf("("); var bracket2 = funcStr.indexOf(")"); var argsStr = funcStr.slice(bracket1+1,bracket2); var args = argsStr.split(","); return args.map(function(e){ return e.trim(); }); }; var funcStr = this.toString(); var args = findArgs(funcStr); var bigBracket1 = funcStr.indexOf("{"); var bigBracket2 = funcStr.lastIndexOf("}"); var body = funcStr.slice(bigBracket1+1,bigBracket2); args.push(body); return Function.apply(null,args); };
Diese Schreibmethode nutzt die Eigenschaften der Function-Funktion und erhält zunächst die ursprüngliche Zeichenfolge der Funktion wird die Parameterliste abgefangen und die Zeichenfolge des Funktionskörpers wird nacheinander in den Funktionsaufruf eingefügt.
Dieser Abfangprozess kann mit regulären Ausdrücken geschrieben werden, um den Code prägnanter zu gestalten.
Das Obige ist der Inhalt interessanter JavaScript-Fragen: Funktionsklonen Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!