https://developer.mozilla.org/ko/docs/Web/JavaScript/EventLoop
자바스크립트는 코드 실행, 이벤트 수집과 처리, 큐에 놓인 하위 작업들을 담당하는 이벤트 루프에 기반한 동시성(concurrency) 모델을 가지고 있습니다. 이 모델은 C 또는 Java와 같은 언어와 완전히 다릅니다.
이어지는 섹션에서는 이론적 모델을 설명합니다. 모던 자바스크립트 엔진들은 아래 묘사된 개념들을 구현하고 최적화 합니다.
함수 호출은 프레임들의 스택을 형성합니다.
function foo(b) {
var a = 10;
return a + b + 11;
}
function bar(x) {
var y = 3;
return foo(x * y);
}
console.log(bar(7)); //returns 42
bar
를 호출할 때, bar
의 인자와 지역 변수를 포함하는 첫 번째 프레임이 생성됩니다. bar
가 foo
를 호출하면 두 번째 프레임이 만들어져 foo
의 인수와 지역 변수가 들어있는 첫 번째 프레임의 맨 위에 푸시됩니다. foo
가 반환되면, 최상위 프레임 요소는 bar
의 호출 프레임만을 남겨둔 채로 스택 밖으로 빠져나옵니다. bar
가 반환되면, 스택은 비워집니다.
객체들은 힙 안에 할당됩니다. 힙은 구조화되지 않은 넓은 메모리 영역을 지칭합니다.
JavaScript 런타임은 처리 할 메시지 목록 인 메시지 대기열을 사용합니다. 각 메시지에는 메시지를 처리하기 위해 호출되는 관련 함수가 있습니다.
event loop 중 어떤 시점에서 런타임은 대기열에서 가장 오래된 메시지부터 처리하기 시작합니다. 그렇게하기 위해, 메시지는 큐에서 제거되고 해당 기능이 메시지를 입력 매개 변수로 호출됩니다. 언제나 그렇듯이, 함수를 호출하면 그 함수의 사용을위한 새로운 스택 프레임이 생성됩니다.
함수의 처리는 스택이 다시 비워 질 때까지 계속됩니다. 이벤트 루프는 큐의 다음 메시지를 처리합니다(존재할 경우).
Event loop는 그 구현 방식 때문에 붙은 이름이며 보통 다음과 유사합니다 :
while(queue.waitForMessage()){
queue.processNextMessage();
}
queue.waitForMessage()
함수는 현재 아무 메시지도 없다면 새로운 메시지 도착을 동기적으로 기다립니다.