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 의 프로젝트 코드입니다 .
그러나 모든 뉴스가 좋은 것은 아닙니다.
-
정말 (읽기 스택 추적이 너무 조심해야 얻을 둔화되고 이 이상).
-
스택 추적을 읽을 수 있도록 함수 이름을 정의해야합니다. 다음과 같은 코드가 있다면 :
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 함수에 옵션을 전달할 수는 있지만 그렇게해도 실제로 개선되지는 않았습니다. -
모든 브라우저가 동일한 정보를 제공하는 것은 아닙니다. 즉, 매개 변수, 코드 열 등
발신자 기능 이름
그런데 호출자 함수의 이름 만 원한다면 (대부분의 브라우저에서 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()).stack
Chrome에서 사용 합니다. 좋은 점은 호출자가 함수를 호출 한 행 번호를 제공한다는 것입니다. 단점은 스택 길이를 10으로 제한한다는 것입니다. 그래서 처음 에이 페이지에 왔습니다.
(저는 실행 중에 하위 수준 생성자에서 콜 스택을 수집하고 나중에보고 디버그하기 위해 이것을 사용하고 있으므로 중단 점을 설정하는 것은 수천 번에 도달하기 때문에 사용되지 않습니다)
답변
IE <11에서 실행하지 않으면 console.trace () 가 적합합니다.
function main() {
Hello();
}
function Hello() {
console.trace()
}
main()
// Hello @ VM261:9
// main @ VM261:4