>  기사  >  웹 프론트엔드  >  JavaScript 재미있는 질문: 함수 복제

JavaScript 재미있는 질문: 함수 복제

黄舟
黄舟원래의
2017-01-22 14:57:201274검색

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)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.