Heim  >  Artikel  >  Web-Frontend  >  Lustige Frage zu JavaScript: Funktionsklonen

Lustige Frage zu JavaScript: Funktionsklonen

黄舟
黄舟Original
2017-01-22 14:57:201291Durchsuche

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)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn