어제의 내용의 연장선이라 새로 배운 것들만 정리함!
let a = 10
console.log("a : ", a)
function foo() {
for (let i = 1; i < 10; ++i) {
console.log(i)
}
}
foo()
출력
a : 10
1
2
3
4
5
6
7
8
9
10
코드의 흐름과 실제 제어 흐름이 동일하다.
let a = 10
setTimeout(function callback() {
console.log('a : ', a)
}, 3000)
console.log('Finished')
출력
Finished
~~3초 뒤~~
a: 10
코드 흐름과 실제 제어 흐름이 다르다.눈으로 보이는 코드 순서대로라면 a: 10이 먼저 출력되어야 하나 Finished가 먼저 출력된다.
비동기 작업을 기다리는 동안 메인 스레드는 다른 작업을 처리한다. setTimeout함수를 3초간 기다리는 동안 console.log('Finished')가 먼저 출력된다.
비동기 코드를 처리하는 모듈은 자바스크립트 엔진 외부에 있고 이벤트 루프(event loop), 태스크 큐(task queue), 잡 큐(job queue) 등으로 구성된다.
API 모듈은 비동기 요청을 처리 후 태스크 큐에 콜백 함수를 넣는다.
자바스크립트 엔진은 콜 스택이 비워지면, 태스크 큐의 콜백 함수를 실행한다.
태스크 큐는 Web API 작업을 담고, 잡큐는 프로미스 API나 애니메이션 프레임 작업을 담는다.