1. 이벤트 루프(Event Loop)
Node는 Javascript Code의 맨 위부터 한 줄씩 실행한다.
함수 호출 부분을 발견했다면 호출한 함수를 호출 스택(Call Stack)에 넣는다.
function first(){
second();
console.log(‘1’);
};
function second(){
third();
console.log(‘2’);
};
function third(){;
console.log(‘3’);
};
first();
anonymous 함수는 처음 실행 시에 전역 컨텍스트(global context)를 의미한다.
* 컨텍스트는 함수가 호출되었을 때 생성되는 환경을 의미한다.
* Javascript Code는 실행 시 기본적으로 전역 컨텍스트 안에서 돌아간다고 생각하는게 좋다.
함수는 실행되는 동안 호출 스택에 머물러 있다가 실행이 완료되면 호출 스택에서 지워진다.
third, second, first, anonymous 순서로 지워지고, anonymous 컨텍스트까지 실행이 모두 완료되었다면 호출 스택은 비어 있게 된다.
이벤트 루프 :
이벤트 발생 시 호출할 콜백 함수들을 관리하고, 호출된 콜백 함수의 실행 순서를 결정하는 역할을 담당한다. Node가 종료될 때까지 이벤트 처리를 위한 작업을 반복하므로 루프(Loop)라고 부른다.
백그라운드 :
setTimeout 같은 타이머나 이벤트 리스너들이 대기하는 곳이다. Javascript가 아닌 다른 언어로 작성된 프로그램이라고 봐도 무관하다. 여러 작업이 동시에 실행될 수 있다.
태스트 큐 :
이벤트 발생 후, 백그라운드에서는 태스크 큐로 타이머나 이벤트 리스너의 콜백 함수를 보낸다. 정해진 순서대로 콜백들이 줄을 서 있으므로 콜백 큐라고도 부른다. 콜백들은 보통 완료된 순서대로 줄을 서 있지만 특정한 경우에는 순서가 바뀌기도 한다.
* 위의 내용들은 이해를 돕기 위해 추상화해서 설명한 내용입니다.
* 그림에서는 태스크 큐가 하나의 큐처럼 보이지만 실제로는 여러 개의 큐로 이루어져 있으며, 이벤트 루프는 정해진 규칙에 따라 콜백 함수들을 호출 스택으로 부른다.
* 만약 호출 스택에 함수들이 너무 많이 들어 있으면 3초가 지난 후에도 run 함수가 실행되지 않을 수도 있다. 이벤트 루프는 호출 스택이 비어 있을 때만 태스크 큐에 있는 run 함수를 호출 스택으로 가져오기 때문이다. 따라서 setTimeout의 시간이 정확하지 않을 수도 있는 이유이다.