2012-09-13 10 views
4

다음 예제를 고려하십시오.Javascript에서 호출하는 함수의 이름을 얻는 방법은 무엇입니까?

var obj = function(){}; 

function apply(target, obj) { 

    if (target && obj && typeof obj == "object") { 
     for (var prop in obj) { 
      target[prop] = obj[prop]; 
     } 
    } 

    return target; 
} 

apply(obj.prototype, { 
    firstFunction: function(){ 
     this.secondFunction(); 
    }, 
    secondFunction: function(){ 
     // how do I know what function called me here? 
     console.log("Callee Name: '" + arguments.callee.name + "'"); 
     console.log("Caller Name: '" + arguments.callee.caller.name + "'"); 
    } 
}); 

var instance = new obj(); 

instance.firstFunction(); 

UPDATE는

두 답변은 정말 최고입니다. 고맙습니다. 그런 다음 객체 내에서 재귀 함수 또는 부모 함수를 호출하는 문제를 조사하고 여기에서 해결책을 찾았습니다. 이렇게하면 arguments.callee/caller 속성을 사용하지 않고 함수 이름을 검색 할 수 있습니다.

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/function

+3

고려해야 할 사항은 무엇입니까? –

+5

'arguments.callee'는'엄격한 모드 '에서 더 이상 사용되지 않고 사용할 수 없다는 것을 알아 두어야합니다. –

답변

3

에 대해 살펴 함수의 이름 그 기능의 불변의 속성입니다, 초기 함수 표현식에서 설정합니다.

var notTheName = function thisIsTheName() { ... } 

someObj.stillNotTheName = function stillTheName() { ... } 

함수 표현식에 이름이 없으면 이름으로 식별 할 수있는 방법이 없습니다. 함수에 변수를 할당해도 이름이 지정되지 않습니다. 이 경우 여러 변수에 할당 된 표현식의 이름을 결정할 수 없습니다.

당신은

또한, arguments.callee가되지 않습니다
firstFunction: function firstFunction(){ 
    this.secondFunction(); 
} 

로 표현함으로써 firstFunctionname 속성을 설정해야합니다. arguments.callee의 역사에 대한 아주 좋은 설명은 Why was the arguments.callee.caller property deprecated in JavaScript?을 참조하십시오.

+0

다음 질문은 arguments.callee가 더 이상 사용되지 않으면 좋은 해결책/해결 방법은 무엇입니까? 내가 제공 한 링크의 기록을 읽었지 만 용인 할만한 해결책을 찾지 못했습니다. – Matt

+0

함수 본문에서 함수를 호출하는 방법을 MDN에서 찾을 수 있습니다. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/function – Matt

4

는 기능과 같은

에 이름을 지정 :

var obj = function(){}; 

function apply(target, obj) { 

    if (target && obj && typeof obj == "object") { 
     for (var prop in obj) { 
      target[prop] = obj[prop]; 
     } 
    } 

    return target; 
} 

apply(obj.prototype, { 
    firstFunction: function firstFunction(){ 
     this.secondFunction(); 
    }, 
    secondFunction: function secondFunction(){ 
     // how do I know what function called me here? 
     console.log("Callee Name: '" + arguments.callee.name + "'"); 
     console.log("Caller Name: '" + arguments.callee.caller.name + "'"); 
    } 
}); 

var instance = new obj(); 

instance.firstFunction(); 

question

관련 문제