ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の楽しい質問: 関数の複製

JavaScript の楽しい質問: 関数の複製

黄舟
リリース: 2017-01-22 14:57:20
オリジナル
1294 人が閲覧しました

JavaScript で関数を複製するにはどうすればよいですか?

言い換えると、関数のパラメーター リストと関数本体を新しい関数に複製するにはどうすればよいでしょうか?

例えば Function.prototype.clone メソッドがある場合、関数のクローンを作成するために使用されます。

var original = function original_name(a, b) { return a + b; };  
  
var cloned = original.clone();  
alert(cloned == original); //false
ログイン後にコピー

新しい関数は独自のスコープを持ちます。使い方は元の関数とまったく同じです。


まず、evalを使用することを間違いなく考えます。Evalは、強力な魔法の力を持っている悪魔であると言えます。

この要件を達成するには、ほんの数行のコードが必要です:

Function.prototype.clone = function(){  
    var func;  
    eval("func = " + this.toString());  
    return func;  
};
ログイン後にコピー

eval が機能するので、その兄弟 Function も間違いなくそれを実行できます:

Function.prototype.clone = function(){  
    return new Function("return " + this.toString())();  
};
ログイン後にコピー

このコード行はさらに鋭いですが、Function の使用法が変更されます、または新しい解決策:

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);  
};
ログイン後にコピー

この書き方は Function 関数の特性を利用しており、最初に元の関数の文字列を取得し、パラメーター リストと関数本体の文字列をインターセプトし、関数呼び出しを注入します。順序。


このインターセプトプロセスは、コードをより簡潔にするために正規表現を使用して記述することができます。

上記は JavaScript に関する興味深い質問の内容です: 関数の複製 詳細については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート