저번예제

function run() {
  console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/36215216-0c4e-4cae-8721-17ce23ac3832/Untitled.png

중요

  1. 호출스택에 전역 컨텍스트인 anonymous 가 먼저 쌓이고 setTimeout()가 호출 스택에 쌓인다.
  2. 호출 스택에 들어간 순서와 반대로 실행되므로, setTimeout이 먼저 실행된다.
  3. setTimeout이 실행되면 타이머와 함께 run 콜백을 백그라운드로 보내고, setTimeout은 호출 스택에서 빠진다.
  4. 그다음으로 anonymous가 호출 스택에서 빠진다.
  5. 백그라운드에서는 3초를 센 후 run 함수를 태스크 큐로 보낸다.
  6. 3초를 세었다는 것은 백그라운드에 맡겨진 작업이 완료된 것으로 이해해도 된다.
  7. 테스크 큐는 하나의 큐처럼 보이지만 여러개의 큐로 이루어져 있다.
  8. 이벤트 루프는 정해진 규칙에 따라 콜백 함수들을 호출 스택으로 부른다.
  9. 호출 스택에서 anonymous까지 실행이 완료되어 호출 스택이 비어 있는 상황에서 이벤트 루프는 호출 스택이 비어 있으면 태스크 큐에서 함수를 하나씩 가져와 호출 스택에 넣고 실행한다.
  10. 이벤트 루프가 run 콜백을 태스크 큐에서 꺼내 호출 스택으로 올린 상황에서. 호출 스택으로 올려진 run은 실행되고, 실행 완료 후 호출 스택에서 비워진다. 이벤트 루프는 태스크 큐에 콜백 함수가 들어올 때까지 계속 대기