
JS가 브라우저에서 실행되면 어떤 과정인지, 여기서 JS만의 신기한 기능인 이벤트 루프에 대해서 작성해보겠습니다.
자바스크립트는 단일 스레드 언어로, 한 번에 하나의 작업만 실행할 수 있습니다. 이벤트 루프는 비동기 작업을 관리해 프로그램이 멈추지 않고 실행될 수 있도록 합니다.
함수가 호출되면 콜 스택에 추가되고, 함수가 실행을 완료하면 스택에서 제거됩니다.

greet() 함수가 호출돼 콜 스택에 추가됩니다.greet() 함수가 "Hello!"를 반환하고 콜 스택에서 제거됩니다.respond() 함수가 호출돼 콜 스택에 추가됩니다.respond() 함수 내의 setTimeout이 웹 API로 전달됩니다.setTimeout과 respond() 함수가 값을 반환하고 콜 스택에서 제거됩니다.비동기 작업(예: setTimeout)은 브라우저의 웹 API를 통해 처리됩니다. 이 작업은 완료된 후 큐(Queue)에 콜백 함수를 추가합니다.

respond() 함수가 호출되면 setTimeout 함수가 콜 스택에 추가됩니다.setTimeout 함수가 웹 API로 콜백을 전달하고 콜 스택에서 제거됩니다.타이머가 만료되면 콜백 함수가 바로 콜 스택에 추가되는 것이 아니라 큐(Queue)에 추가됩니다. 이때, 이벤트 루프가 큐와 콜 스택을 연결하는 역할을 합니다.



const foo = () => console.log('First');
const bar = () => setTimeout(() => console.log('Second'), 500);
const baz = () => console.log('Third');
bar();
foo();
baz();

bar() 호출: setTimeout이 웹 API로 보내지고, bar는 스택에서 제거됨.foo() 호출: "First" 출력 후 스택에서 제거됨.baz() 호출: "Third" 출력 후 스택에서 제거됨.출처: Lydia Hallie
let myFirstPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Success!");
}, 1000);
});
myFirstPromise.then((successMessage) => {
console.log("Yay! " + successMessage);
});
이 코드의 실행 순서는 다음과 같습니다:
new Promise(...) 생성자가 호출됩니다.
myFirstPromise 변수에 할당됩니다.setTimeout 함수가 호출됩니다.
setTimeout은 비동기 함수이므로, 타이머 설정 후 즉시 다음 코드로 넘어갑니다.myFirstPromise.then(...) 메서드가 호출됩니다.
then에 전달된 콜백 함수가 Promise의 성공 처리기(handler)로 등록됩니다.동기적인 코드의 실행이 모두 완료됩니다. 이벤트 루프는 비동기 작업을 기다립니다.
약 1초 후, setTimeout의 콜백 함수가 실행됩니다.
resolve("Success!") 함수가 호출됩니다.Promise가 이행되었으므로, then에 등록된 콜백 함수가 다음 마이크로태스크 큐에 추가됩니다.
이벤트 루프는 마이크로태스크 큐에서 then의 콜백 함수를 가져와 실행합니다.
console.log("Yay! " + successMessage);가 실행되어 "Yay! Success!"가 콘솔에 출력됩니다.then 메서드 호출은 동기적으로 즉시 실행됩니다.setTimeout의 콜백과 Promise 해결 후의 then 콜백은 비동기적으로 나중에 실행됩니다.then 콜백의 실행 사이에는 약간의 시간 차이가 있을 수 있습니다 (마이크로태스크 큐를 통해 처리되기 때문).