
비동기(Asynchronous Programming)
하나의 코드나 함수의 실행이 끝나기 전에 다음 코드나 함수를 실행하는 것
js 엔진은 런타임에서 실행된다
런타임(Runtime) : 특정 언어로 만든 프로그램을 실행할 수 있는 환경
(예) 브라우저, Node.js
이 런타임에서 js 엔진이 돌아가서 실행이 되는 것이다

(출처: Javascript 동작원리 (Single thread, Event loop, Asynchronous) - vincent)
Task Queue에 전달한다Task Queue에 담겨 있는 콜백 함수들을 콜스택에 넘겨준다Microtask Queue, Animation Frames 등이 있음논블로킹(Non-blocking)
- 실행 중인 코드 외에 다른 코드의 실행을
막지 않음
블로킹(blocking)
- 실행 중인 코드 외에 다른 코드의 실행을
막음
➡️ 비동기 작업을 하려면 요청 간 논블로킹이 되어야 한다
런타임에서 지원하는 API로 위임하기 때문에 이 작업을 완료할 때까지 싱글 스레드 언어임에도 다른 코드를 실행할 수 있는 것이다console.log('hi') // 1
setTimeout(()=>console.log('asynchronous'), 1000) // 2
console.log('one') // 3
console.log('two') // 4
console.log('bye') // 5
(1) 1번 코드가 콜 스택에 올라가고 실행이 완료되면(콘솔에 hi 출력) 스택에서 제거된다
(2) js가 비동기 작업을 web API에 위임하고, web API에서 Timer가 생성된다
(2)-1. 1초 후에 Timer가 이벤트 루프를 통해 Task Queue로 콜백 함수(1번 코드의 console.log('asynchronous'))를 보낸다
(3) (2)가 실행되는 중에 3,4,5 코드가 차례로 실행되고(콘솔에 각 문자열 출력) 스택에서 제거된다
(4) 스크립트 내 모든 코드가 실행되어 콜 스택이 비면 Task Queue에서 대기하고 있던 콜백 함수를 콜 스택으로 보낸다
(5) 2번 코드의 콜백 함수가 실행되고, 콜 스택에서 제거된다
/* 출력 결과
hi
one
two
bye
asynchronous
*/
논블로킹 IO의 개념은 특히 Node.js에서 많이 나오기 때문에, 관련해서 Node.js의 동작 원리가 궁금하시다면 이 글을 읽어보면 도움이 될 것 같습니다!