2011-11-08 2 views
11

javascript에서 스택 오버플로를 피할 수 있습니까? setTimeout 메서드를 사용하여 직접 호출하지 않고 함수를 호출 할 수 있습니까? setTimeout에 대한 나의 이해는 새로운 콜 스택 (callstack)을 시작해야한다는 것이다. 크롬과 IE의 호출 스택을 보면 setTimeout 호출이 반환 할 함수 호출을 기다리고있는 것으로 보입니다.setTimeout을 호출하면 콜 스택이 지워 집니까?

이것은 디버거의 속성인가요? 아니면 제 이해에 결함이 있습니까?

EDIT

아래에 제공된 응답이 정확하지만, I가 갖는 한 실제 문제 I 때문에 즉시 aFunction 평가 하였다에서는 setTimeout (aFunction(), 10)를 호출하고 있다는 사실과 관련되었다 괄호. This question 나를 분류했습니다.

+0

기능은 setTimeout' 반환'호출 기능 이전에 호출 할 수 없습니다. 그래서 예, 그 함수는 새로운 콜 스택을 시작합니다. –

답변

12

스택이 삭제되었음을 확인할 수 있습니다.

이 시나리오 고려 :
function a() { 
    b(); 
} 

function b() { 
    c(); 
} 

function c() { 
    debugger; 
    setTimeout(d, 1000); 
} 

function d() { 
    debugger; 
} 

a(); 

그래서 두 개의 브레이크 포인트가를 - 기능 c의 시작 부분에 하나, 그리고 기능 d의 시작 하나.

  • C()
  • B()
  • 초 중단 점에서()

스택 : 제 브레이크 포인트

스택

  • D()

라이브 데모 : setTimeout``에 전달http://jsfiddle.net/nbf4n/1/

+0

올바른 방향으로 나를 가리키는 주셔서 감사합니다, 나는 당신의 대답을 기반으로 해결할 수있었습니다, 그러나 나는 또 다른 질문을 참조하십시오 http://stackoverflow.com/questions/8058996/why-does-calling-settimeout-with-parenthesis- 시작하지 않는 새 걸음 걸이 –

+0

이 사람이 맞으면 어떻게 대답 할 수 있습니까? 이 사람은 항상 콜백 대기열에 먼저 콜백을 푸시한다고 말하기 때문에 스택이 아니므로 호출 스택에서 동기 명령이 여전히 실행 중이거나 스택의 다른 것들이 지정된 밀리 초보다 오래 대기해야합니다 . 따라서 항상 1 : 1이되는 것은 아닙니다. 이 일이 일어날 수 있습니다. 왜 내가 7 초 후에 5 초 지연을 준거야? 콜백이 좀 더 기다려야했기 때문입니다. https://youtu.be/8aGhZQkoFbQ?t=782 – PositiveGuy

+0

'setTimeout'의 두 번째 인수를 통해 지정한 지연이 특정 시점에 콜백이 호출되도록 보장하지는 않습니다. 하지만 내 대답은 그렇게 말할 수는 없다. –

4

비동기 호출 (예 : setTimeout)은 실제로 새로운 호출 스택을 생성합니다.

"크롬과 IE의 콜 스택을 보면 setTimeout 호출이 함수 호출이 돌아 오기를 기다리고있는 것 같습니다."라고 말할 때 설명하는 내용이 완전히 명확하지 않습니다. 그러나 당신이 할 수있는 한가지는 setTimeout이 호출하는 함수 안에 중단 점을 넣고 콜 스택이 비어 있음을 확인하는 것입니다.

+0

디버거에서 전체 호출 스택을 여전히 볼 수있는 이유를 알고 계십니까? 그것은 setTimeout에서 함수 호출이 클로저를 사용하여 특정 지역 변수에 도달했기 때문입니까? –

+1

@AranMulholland 디버거를 어디에서 호출합니까? 'setTimeout'으로 전달되는 함수 안에 있습니까? –

+0

@ imeVidas 질문에 따라, 나는 브라우저 디버거 (크롬과 IE)의 호출 스택을보고있다. –

관련 문제