저번예제
function run() {
console.log('3초 후 실행');
}
console.log('시작');
setTimeout(run, 3000);
console.log('끝');
- 순서가 이렇게 나오는 이유는 setTimeout 이라는 함수는 스레드 풀에 들어가서 대기한 다음 출력되는 형태로써 단일스레드라는 노드JS 특성과 이해하기 혼돈할 점이 많지만 스레드풀에 있는 4개의 스레드와 같이 병행하며 작업한다는 점을 잊지말자.
- 호출 스택에서 setTimeout 함수의 콜백 결과인 run이 호출 스택에 언제 들어기는지에 대해서는 선행 학습 내용이 필요하다.
- 이벤트 루프: 이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. 노드가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(loop)라고 부른다.
- 백그라운드: setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳이다. 자바스크립트가 아닌 다른 언어로 작성된 프로그램이라고 봐도 된다. 여러 작업이 동시에 실행될 수 있다.
- 태스크 큐: 이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부른다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 한다.
중요
- 호출스택에 전역 컨텍스트인 anonymous 가 먼저 쌓이고 setTimeout()가 호출 스택에 쌓인다.
- 호출 스택에 들어간 순서와 반대로 실행되므로, setTimeout이 먼저 실행된다.
- setTimeout이 실행되면 타이머와 함께 run 콜백을 백그라운드로 보내고, setTimeout은 호출 스택에서 빠진다.
- 그다음으로 anonymous가 호출 스택에서 빠진다.
- 백그라운드에서는 3초를 센 후 run 함수를 태스크 큐로 보낸다.
- 3초를 세었다는 것은 백그라운드에 맡겨진 작업이 완료된 것으로 이해해도 된다.
- 테스크 큐는 하나의 큐처럼 보이지만 여러개의 큐로 이루어져 있다.
- 이벤트 루프는 정해진 규칙에 따라 콜백 함수들을 호출 스택으로 부른다.
- 호출 스택에서 anonymous까지 실행이 완료되어 호출 스택이 비어 있는 상황에서 이벤트 루프는 호출 스택이 비어 있으면 태스크 큐에서 함수를 하나씩 가져와 호출 스택에 넣고 실행한다.
- 이벤트 루프가 run 콜백을 태스크 큐에서 꺼내 호출 스택으로 올린 상황에서. 호출 스택으로 올려진 run은 실행되고, 실행 완료 후 호출 스택에서 비워진다. 이벤트 루프는 태스크 큐에 콜백 함수가 들어올 때까지 계속 대기