Javascript는 기본적으로 싱글 스레드 언어 이다. '싱글' 스레드라 한 번에 하나의 작업만 수행이 가능하다.
멀티 스레드를 지원하여 원하는 코드 로직을 동시에 수행 시키는 멀티 작업이 가능한 Java 나 Python 과는 다른 것
하지만 당연히 웹 애플리케이션에서는 네트워크 요청이나 이벤트 처리, 타이머와 같은 작업은 멀티 (병렬) 처리되어야 한다. 만일 싱글 스레드로 브라우저 동작이 한번에 하나씩 수행하게 되면, 우리가 파일을 다운로드 받을 동안 브라우저는 파일을 다 받을 때 까지 정지하게 됨..
따라서 파일 다운, 네트워크 요청, 타이머, 애니메이션 이러한 시간이 소요되고 반복적인 작업들은 JS 엔진이 아니라 브라우저 내부의 멀티 스레드인 Web APIs 에서 비동기적으로 처리된다.





위 그림을 참고하여 이벤트 루프와 테스크 큐 에 개념에 대해서 설명할 수 있다.
이벤트 루프는 브라우저 내부의 Call Stack, Task Queue , Web APIs 등의 요소들을 모니터링 하면서 비동기적으로 실행되는 작업들을 관리하고 이를 순서대로 처리하여 프로그램의 실행 흐름을 제어하는 녀석이다.
간단하게 말하면 브라우저의 동작 타이밍을 제어하는 관리자 라고 보면된다.
여기서 콜 스택(Call Stack) 이란 함수가 호출될 때 그 함수가 실행되는 환경(컨텍스트)이 스택에 추가되는 공간을 말한다.
테스크 큐(Task Queue) 는 비동기 작업의 콜백 함수들이 대기하는 큐 공간을 말한다. WebAPIs에서 진행되는 비동기 작업이 완료되면 해당 작업의 콜백이 테스크 큐에 추가된다.
이벤트 루프 는 콜 스택이 비어있을 때 테스크 큐에 있는 작업을 콜 스택으로 이동시켜 실행한다. 이러한 과정을 통해 비동기 작업이 실행되는 것.