2011-12-05 2 views
7

자바 스크립트 자체를 사용하여 자바 스크립트에서 실행되는 모든 함수의 스택 깊이를 결정하는 방법이 있습니까?자바 스크립트를 사용하여 자바 스크립트에서 스택 깊이를 결정

Function 프로토 타입을 수정하는 것이 좋겠다고 생각하고 있지만 실제로 생각할 필요는 없습니다.

또한 스택 깊이가 충분히 클 때 언제든지 중단 할 수 있으면 좋을 것입니다.

이유는 내가 stack overflow error in IE which is apparently not debuggable입니다. 나는 게으르다. 나는 그 원인을 찾기 위해 유지하고있는 코드를 사냥 할 필요가 없다.

내 게으름을 도와 주셔서 감사합니다.

+0

브라우저 자체에서 스택 오버플로 오류가 발생할 때까지 한 함수에서 다른 함수로 전역 변수를 증가시킬 수 있습니다. 그런 다음 카운터 변수를 인쇄하면 스택 깊이에 대한 원가가 계산됩니다. – Bojangles

답변

5

ECMA 스크립트는 상당 기간 Function.prototype.caller 속성을 지원합니다. ES5가 더 이상 사용되지 않아도 IE는 여전히이를 지원해야합니다. 그래서 당신은 기본적으로 관련 함수를 통해 당신의 방법을 반복 할 수 있습니다.

function one() { 
    two(); 
} 

function two() { 
    three(); 
} 

function three() { 
    var caller = three.caller; 

    console.log('caller was: ', caller.name); 

    while(caller = caller.caller) { 
      console.log('caller was: ', caller.name); 
    } 
} 

(function outer() { 
    one(); 
}()); 

그 출력 :

오류가 발생 기능을하는 알고있는 경우
caller was: two 
caller was: one 
caller was: _outer 

그래서, 그런 식으로 당신이 대답이 방법은 원래 불렀다까지 어떻게 모든 방법을 얻을. 깊이가있는 경우 caller.caller 속성을 통해 몇 번만 인터랙션을 만들었는지 계산할 수 있습니다. 최소한 IE8은 "디버거"문을 지원해야합니다.이 문은 해당 스크립트에서 호출하여 디버거를 스테이지에 가져올 수 있습니다.

+0

이것은 내가 할 일처럼 많이 보입니다 ...하지만 그 일은 코드에 추가하지 않고 모든 기능에이 기능을 적용해야 할 필요가 있다는 것입니다. 내가 뭐라는지 알 겠어? 감사. – user420667

+1

@ user420667 : Function.prototype보다 쉬운 방법이 없다고 생각합니다. 기본적으로 모든 객체 ('window'로 시작하는)에 대해 재귀 루프를 수행하고 함수를 확인해야합니다. 하나를 찾았 으면 메서드를 후크/패치하고 위의 제공된 코드를 호출해야합니다. 일할 수도 있습니다. – jAndy

+0

아, 알았어 .. 각 함수와 비슷해 ... newFunction = function() {oldFunction (args); if (CallerDepth()> MaxAllowedDepth) {디버거;}}; oldFunction = newFunction; ??? 나는 그것이 옳다고 생각하지 않는다. 또한, 당신이 말했듯이, 어떻게 든 다른 함수가 호출되기 전에 호출되는지 확인하고, 함수를 수정하기 전에 반복 할 함수 목록이 생성되도록해야합니다. – user420667

4
function stackDepth() { 
    var c=stackDepth.caller, depth=0; 
    while (c) { c = c.caller; depth++; } 
    return depth; 
} 

크롬은 어쩌면 각 자바 스크립트 환경은 초기 기본 깊이를 결정하고 그에서 뺄 필요 했어, 콘솔에서 스택 깊이가 이미 3이라고 생각하는 것 같다.

stackDepth(); // => 3 
(function(){return stackDepth();})(); // => 4 
+0

입니다. 나는 3 개의 더 높은 레벨의 물건이 무엇인지에 관해 궁금하게 생각한다. 창문? 문서? – user420667

관련 문제