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) に注目してください。