2016-09-01 6 views
2

로깅 목적으로 요소 함수 속성에 대한 래퍼 함수를 ​​만들었습니다.호출 된 함수의 현재 요소 속성 이름에 액세스하는 방법

functionsWrapper: function() { 
    for (i = 0, args = new Array(arguments.length); i < arguments.length; i++) { 
     args[i] = arguments[i]; 
    } 

    console.log('call for ' + arguments.callee.name + ' with params ' + argumantsLog(args)); 

    return this['original' + arguments.callee.name].apply(this, args); 
} 

그리고 나는 요소의 기능을 래핑하는이 코드를 사용하고 있습니다 : 래퍼 기능 이상입니다

logFunctionsCalls: function (element) { 
    if (!element) 
     return; 

    if (element.children && element.children.length) 
     for (var i = 0; i < element.children.length; i++) 
      logFunctionsCalls(element.children[i]); 

    if (!element.functionsLogged) { 
     element.functionsLogged = true; 

     for (var property in element) { 
      if (typeof element[property] != 'function') 
       continue; 

      element['original' + property] = element[property]; 
      element[property] = functionsWrapper; 
     } 
    } 
} 

내 문제는 arguments.callee가의 속성 이름없이 functionsWrapper 코드가 포함되어 있다는 것입니다 호출 된 함수.

+0

'arguments.callee.name'? 그것은 비추천이고 비표준 속성 하나입니다. 둘 다 실제로 도움이되지 않습니다. – Bergi

답변

1

어디서나 동일한 functionWrapper을 사용할 수 없습니다. 호출 된 속성을 찾을 방법이 없습니다. 대신 다른 래퍼를 만들고 원본을 닫아 두십시오.

for (var p in element) (function(property) { 
    if (typeof element[property] != 'function') 
     return; 

    var original = element[property]; 
    element[property] = function wrapped() { 
     console.log('call for ' + property + ' with params ' + Array.prototype.join.call(arguments)); 
     return original.apply(this, arguments); 
    }; 
}(p)); 
+0

나는 현재 버전 이전에 비슷한 것을 사용했지만, 어떤 이유에서든'arguments' 객체가 다른 함수 호출에서 무의미한 인수를 가리 키기 때문에이를 변경해야합니다. –

+0

"* 다른 함수에서 부적합한 인수가 *를 가리킴"이란 무엇을 의미합니까? 재현 할 수있는 코드 예제를 제공해주십시오. – Bergi

+0

예를 들어, "src", "http://www.google.com/"은 분명히'appendChild' 함수에서'setAttribute'에 대해 전달 된 인수입니다. –