JavaScript가 단일 스레드 기반임에도 불구하고 Node.js가 논블로킹I/O 작업을 수행할 수 있도록,다시 말해 비동기 처리를 할 수 있도록 해주는 핵심 기술이다. 이벤트 루프는 시스템 커널에서 가능한 작업이 있다면 그 작업을 커널에 이관한다.
이벤트 루프는 총 6단계로 이루어지는데, 타이머,대기콜백,유후준비,폴,체크,종료콜백 이다.
for(let i = 0; i<3; i++){
const log = ()=> {
console.log(i)
}
setTimeout(log, 1000)
}
// 3, 3, 3
예를들어 어떤 함수(setTimeout) 1000ms가 시간이 걸린다면 타이머에서 지정한 일정 시간(100ms)이 지나면 실행되지 않고 폴단계로 넘어가고, 스택 큐에 나머지 50ms 빈 공간이 있을 때 테스크 큐에서 스택 큐로 넘어가면서 실행되게 된다. (여기서 실행시간을 0으로 하면 동기적으로 되는거 아닌가 라는 생각을 할수 있는데, 0으로 설정하더라도 앞선 스택큐가 먼저 실행되어야 하기 때문에 기다리는 대기시간이 있어서 0으로 설정해도 바로 실행되지 않는다.)
스택 큐에 함수가 쌓이게 두지 않고, 테스크 큐로 넘어가서(논블로킹) 스택큐에 공간이 비었을때, 이벤트 루프가 스택큐로 함수를 넘어가서 함수가 실행되는데, 비동기적인 실행이 된다.