JavaScript에서 함수를 복제하는 방법은 무엇입니까?
즉, 함수의 매개변수 목록과 함수 본문을 새로운 함수로 복제하는 방법은 무엇인가요?
예를 들어 Function.prototype.clone 메소드가 있는 경우 함수를 복제하는 데 사용됩니다.
var original = function original_name(a, b) { return a + b; }; var cloned = original.clone(); alert(cloned == original); //false
새 함수는 완전히 새로운 객체입니다. . 자체 범위가 있지만 사용법은 원래 함수와 정확히 동일합니다.
우선 eval을 사용하는 것이 가장 큰 마법의 힘을 가진 악마라고 말할 수 있을 것입니다.
이 요구 사항을 충족하려면 몇 줄의 코드만 필요합니다.
Function.prototype.clone = function(){ var func; eval("func = " + this.toString()); return func; };
eval이 작동할 수 있으므로 그 형제 함수도 작동할 수 있습니다.
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 함수의 특성을 활용하고 먼저 원래 함수의 문자열을 얻은 후 이를 가로챕니다. 매개변수 목록과 함수 본문의 문자열이 차례로 함수 호출에 주입됩니다.
이 차단 프로세스는 정규식을 사용하여 작성하여 코드를 더욱 간결하게 만들 수 있습니다.
위 내용은 재미있는 자바스크립트 질문 내용입니다: 함수복제 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!