
📅 2025-09-29
➡️ JavaScript 이벤트 루프에 대해 새롭게 알게 된 것 또는 헷갈리는 부분 정리
function blockingTask() {
const start = Date.now();
while (Date.now() - start < 3000) {
// 3초 동안 멍하니 기다림
}
console.log("블로킹 작업 완료");
}
console.log("작업 시작");
blockingTask();
console.log("작업 완료");function nonBlockingTask() {
setTimeout(() => {
console.log("논블로킹 작업 완료");
}, 3000);
}
console.log("작업 시작");
nonBlockingTask();
console.log("작업 완료");setTimeout, fetch .. 비동기 코드를 브라우저 Web APIs에 맡김
백그라운드 작업이 끝나면 콜백을 큐에 적재
호출 스택(call stack)이 비는 순간, 이벤트 루프가 큐에서 콜백을 가져와 실행
이 과정을 반복(loop) 함 이것을 Event Loop

Microtask →Task Queue 순으로 처리됨Microtask Queue → Promise.thenTask Queue → setTimeout, setInterval, fetch, DOM 이벤트 등console.log("Start");
setTimeout(() => console.log("timmer (Task)"), 0);
Promise.resolve().then(() => console.log("Promise (Microtask)"));
console.log("end");
// 실행 결과: 시작 → 끝 → 프로미스 → 타이머
자바스크립트 내부 동작을 시각적으로 보여주는 사이트
Async + Non-blocking
console.log("시작");
setTimeout(() => {
console.log("1초 뒤");
}, 1000);
console.log("끝");
// 출력: 시작 → 끝 → (1초 후) 1초 뒤
Sync + Blocking
function heavySyncWork(ms = 2000) {
const start = Date.now();
while (Date.now() - start < ms) {} // 바쁜 대기(진짜 멈춤)
}
console.log("A");
heavySyncWork(); // 여기서 UI/입력 모두 멈춤
console.log("B");
// 출력: A → (2초 멈춤) → B
Sync + Non-blocking
// 파일 3개를 동시에 읽고(Non-blocking),
// 모두 끝난 시점에 '순서 있게' 후처리(Sync)
import { readFile } from "node:fs/promises";
async function readAll() {
const [a, b, c] = await Promise.all([
readFile("a.txt", "utf8"),
readFile("b.txt", "utf8"),
readFile("c.txt", "utf8"),
]);
// 여기부터는 '세 파일 모두 준비된 이후' — 순차 로직 가능
console.log(a.length, b.length, c.length);
}
readAll();
DOMContentLoadedHTML이 모두 파싱 되었을때 실행
CSS 이미지 같은 리소스 기다리지 않음
document.addEventListener("DOMContentLoaded", () => {
console.log("DOM이 준비되었습니다!");
});
defer 속성 활용DOM 파싱이 끝난 다음에 자동으로 실행 (DOMContentLoaded와 사실상 같은 것)
<script src="script.js" defer></script>
window.onload모든게 다 로드된 후 실행 (이미지, 스타일 등 모든 리소스가 로드)
window.onload = () =>{
console.log("페이지의 모든 리소스가 로드 된 후 완료"):
}