프로그램이 함수 호출을 추적할 때 사용한다
현재 어떤 함수가 동작하고 있는지, 그 함수 내에서 어떤 함수가 동작하는지, 다음에는 어떤 함수를 동작하여야 하는지 등을 제어한다
스택의 LIFO (후입선출) 특성을 생각하면 호출 스택도 비슷한 원리로 동작함을 알 수 있다
메모리 구조에서 스택이 의미하는 것이 바로 이 콜 스택이다
const say = () => {
return "hi i am mouth";
}
const mouth = () => {
say();
}
const body = () => {
mouth();
}
body();
위와 같은 함수 구조가 있다고 생각해보자
body()
에 도달할 때까지, 다른 모든 함수 선언들은 무시하고 지나간다body()
가 호출되었으므로, 호출 스택에 body()
가 추가된다 (push)[body()]
body
함수 내부의 코드를 실행한다
mouth()
를 발견했다mouth()
함수가 호출되었으므로, 호출 스택에 mouth()
가 추가된다 (push)[body(), mouth()]
mouth
함수 내부의 코드를 실행한다
say()
를 발견했다say()
함수가 호출되었으므로, 호출 스택에 say()
가 추가된다 (push)[body(), mouth(), say()]
say
함수 내부의 코드를 실행한다
say
함수는 “hi i am mouth”
를 반환하고, 함수가 끝난다