[javascript] JavaScript에서 호출자 함수를 어떻게 찾습니까?

function main()
{
   Hello();
}

function Hello()
{
  // How do you find out the caller function is 'main'?
}

통화 스택을 찾는 방법이 있습니까?



답변

function Hello()
{
    alert("caller is " + Hello.caller);
}

이 기능은 다음 에서 비표준 입니다 Function.caller.

비표준
이 기능은 비표준이며 표준 트랙이 아닙니다. 웹이있는 프로덕션 사이트에서는 사용하지 마십시오. 모든 사용자에게 적용되는 것은 아닙니다. 구현 간에는 큰 비 호환성이있을 수 있으며 향후 동작이 변경 될 수 있습니다.


다음은 2008 년의 오래된 답변으로, 현대 Javascript에서 더 이상 지원되지 않습니다.

function Hello()
{
    alert("caller is " + arguments.callee.caller.toString());
}


답변

스택 트레이스

브라우저 별 코드를 사용하여 전체 스택 추적을 찾을 수 있습니다. 좋은 점은 누군가 이미 만든 것입니다 . 다음은 GitHub프로젝트 코드입니다 .

그러나 모든 뉴스가 좋은 것은 아닙니다.

  1. 정말 (읽기 스택 추적이 너무 조심해야 얻을 둔화되고 이상).

  2. 스택 추적을 읽을 수 있도록 함수 이름을 정의해야합니다. 다음과 같은 코드가 있다면 :

    var Klass = function kls() {
       this.Hello = function() { alert(printStackTrace().join('\n\n')); };
    }
    new Klass().Hello();
    

    Chrome은 경고 ... kls.Hello ( ...하지만 대부분의 브라우저는 키워드 바로 다음에 함수 이름을 예상하고 function이를 익명 함수로 취급합니다. 함수에 Klass이름 kls을 지정하지 않으면 Chrome조차도 이름 을 사용할 수 없습니다 .

    {guess: true}그건 그렇고, printStackTrace 함수에 옵션을 전달할 수는 있지만 그렇게해도 실제로 개선되지는 않았습니다.

  3. 모든 브라우저가 동일한 정보를 제공하는 것은 아닙니다. 즉, 매개 변수, 코드 열 등


발신자 기능 이름

그런데 호출자 함수의 이름 만 원한다면 (대부분의 브라우저에서 IE는 아님) 다음을 사용할 수 있습니다.

arguments.callee.caller.name

그러나이 이름은 function키워드 다음에 나오는 이름입니다 . 전체 기능의 코드를 얻지 않고 그 이상을 얻을 수있는 방법은 없습니다 (Chrome에서도).


발신자 기능 코드

그리고 나머지 최고의 답변을 요약합니다 (Pablo Cabrera, nourdine 및 Greg Hewgill). 사용할 수있는 유일한 브라우저 간 안전한 브라우저는 다음과 같습니다.

arguments.callee.caller.toString();

호출자 함수 의 코드 가 표시 됩니다. 슬프게도, 그것은 충분하지 않기 때문에 StackTrace와 호출자 함수 이름에 대한 팁을 제공합니다 (크로스 브라우저는 아니지만).


답변

“자바 스크립트로”언급했지만, 목적이 디버깅이라면 브라우저의 개발자 도구를 사용하는 것이 더 쉽다고 생각합니다. Chrome에서 다음과
여기에 이미지 설명을 입력하십시오
같이 표시됩니다. 스택을 조사 할 위치에 디버거를 놓습니다.


답변

요약하자면 (더 명확하게) …

이 코드 :

function Hello() {
    alert("caller is " + arguments.callee.caller.toString());
}

이것과 같습니다 :

function Hello() {
    alert("caller is " + Hello.caller.toString());
}

함수 이름을 “Hello”에서 “Ciao”로 변경하고 여전히 모든 작업을 수행 할 수 있기 때문에 첫 번째 비트는 더 이식성이 뛰어납니다.

후자의 경우 호출 된 함수 (Hello)의 이름을 리팩토링하기로 결정한 경우 모든 발생을 변경해야합니다. (


답변

전체 스택 추적을 얻을 수 있습니다.

arguments.callee.caller
arguments.callee.caller.caller
arguments.callee.caller.caller.caller

호출자가 될 때까지 null.

참고 : 재귀 함수에 무한 루프가 발생합니다.


답변

나는 보통 (new Error()).stackChrome에서 사용 합니다. 좋은 점은 호출자가 함수를 호출 한 행 번호를 제공한다는 것입니다. 단점은 스택 길이를 10으로 제한한다는 것입니다. 그래서 처음 에이 페이지에 왔습니다.

(저는 실행 중에 하위 수준 생성자에서 콜 스택을 수집하고 나중에보고 디버그하기 위해 이것을 사용하고 있으므로 중단 점을 설정하는 것은 수천 번에 도달하기 때문에 사용되지 않습니다)


답변

IE <11에서 실행하지 않으면 console.trace () 가 적합합니다.

function main() {
    Hello();
}

function Hello() {
    console.trace()
}

main()
// Hello @ VM261:9
// main @ VM261:4