여기에서 이벤트루프 라는 친구가 있는데 사실 내가 100프로 이해하지 못해 좀 더 자세히 공부를 해보았다.
어떤분의 블로그를 보고 공부하였는데 이해가 쏙쏙 되었다. 출처는 맨 아래에 남기겠다
자바스크립트는 비동기
로 동작하기 때문에 단일 스레드에도 불구하고 동시에 많은 작업을 수행한다고 한다.
비동기로 동작하는 핵심요소
자바스크립트 언어가 아닌 브라우저 가 가지고 있다. (Node에서는 libuv 라이브러리 등)
브라우저 의 구성은 ?
- Web APIs
- Event Table
- Callback Queue
- Event Loop
- 🎸🏮🏮(기타등등) ...
setTimeout(function exec() {
console.log('second')
}, 1000);
어떤 callback 함수가 호출되야 하는지
를 알고 있는 자료구조입니다. 위 코드에서 호출된 timer가 종료되면 event가 발생하게 되는데 이때 exec callback 함수가 실행되어야 한다는 것을 Event Table
이 알고 있습니다.Call Stack
과 Callback Queue
를 감시합니다.console.log('first')
setTimeout(function cb() {
console.log('second')
}, 1000); // 0ms 뒤 실행
console.log('third')
console.log('first')
가 Call Stack
에 추가가 되고
console.log('first')
가 실행되어 브라우저 화면에 출력하고 Call Stack
에서 제거
setTimeout(function cb() {..})
이 Call Stack
에 추가된다.setTimeout
함수가 실행되면서 Browser가 제공하는 timer Web API
를 호출합니다. 그 후 Call Stack
에서 제거됨
그 다음순서인 console.log(‘third’)
가 Call Stack
에 추가됨
console.log(‘third’)
가 실행되어 화면에 출력되고 Call Stack
에서 제거됨
setTimeout
함수에 전달한 0ms 시간이 지난뒤 Callback
으로 전달한 cb 함수가 Callback Queue
으로 추가Event Loop
는 Call Stack
이 비어있는 것을 확인하고 Callback Queue
를 살펴봅니다. cb
를 발견한 Event Loop
는 Call Stack
에 cb
를 추가cb
함수가 실행 되고 내부의 console.log(‘second’)
가 Call Stack
에 추가됨console.log(‘second’)
가 화면에 출력되고 Call Stack
에서 제거됨cb
가 Call Stack
에서 제거됨Event Loop 는 ?
Call Stack 이 비어있을 경우 Callback queue 에서 함수를 꺼내 Call Stack 에 추가 하는 것 !
console.log('first');
setTimeout(
function cb() {
console.log('second');
}
, 0);
wait3Seconds();
console.log('third');
function wait3Seconds() {
let start = Date.now(), now = start;
while (now - start < 3 * 1000) {
now = Date.now();
}
}
first
third
second
....
wait3Seconds
함수가 실행된 후 3초 동안 Call Stack
및 Event Loop
상태를 그림으로 확인해보자
setTimeout
이 호출되고 0ms
뒤에 callback
으로 전달 된 cb
는 이미 Callback Queue
안에 있다. 근데 왜 second
가 third
보다 뒤에 출력이 될까 ?
-> Call stack
에 wait3Seconds
함수가 있기 때문이다.
내가 위에 적은 Event Loop 기억하는가?
Event Loop
에Call Stack
이 비어있지 않기 때문에Callback Queue
를 확인하지 않는다. 그러니까wait3Seconds
함수 종료 후에cosole.log('third')
가Call Stack
에 추가되어 먼저 출력이 되는 것이다.
1. setTimeout 의 delay 인자가 delay ms 후에 실행되는 것을 보장하지 않는다.
-> 즉, delay ms 후에 Callback Queue 에 들어가는 것을 보장한다.
그러니까, 나는 자바스크립트 언어가 비동기 특성을 제공하는 줄 알았는데 그게 아니라
브라우저 의 구성 요소들이 비동기를 제공하는 것 이었다.
Call Stack
이 비어있을 경우 Callback Queue
에서 함수를 꺼내 Call Stack
에 추가 하는 것 !Call Stack
에 함수가 있다면 Callback Queue
동작 안한다 !💡 자바스크립트 언어 자체가 비동기 동작 을 지원하는게 아니라 브라우저 의 구성요소들이 제공하는 것이다 !