[동기 = 싱글스레드]
- 한번에 하나의 작업을 수행
[비동기 = 멀티스레드]
- 하나의 작업을 수행하며 그동안 다른 작업을 수행
- 스레드가 여러개 진행되고 있음
자바스크립트는 싱글스레드이고 하나의 콜스택을 가지고 있음
console.log("1");
setTimeout(console.log, 5000, "2");
console.log("3");
코드 실행에 따라 스택 프레임이 쌓이는 곳
현재 동작하고 있는 함수, 함수 내 동작하는 함수, 다음에 호출되어야 하는 함수 등을 제어
LIFO, 후입 선출
자바스크립트는 단일 콜스택을 가지고 있으므로 싱글스레드라 불림
Run-to-completion - 다른 함수가 실행되고 있을 때는 종료 직전까지 다른 작업이 중간에 끼어들 수 없음
스택프레임 - 콜스택의 각각을 부르는 용어
스택트레이스 - 예외가 발생했을 때 콜스택의 상태
스택날림 - 콜 스택의 치대크기에 다다랐을 때
동작 예시
function multiply(x, y) {
return x * y;
}
function printSquare(x) {
var s = multiply(x, x);
console.log(s);
}
printSquare(5);
- 자바스크립트 엔진을 '구동하는 환경', 즉 브라우저나 Node.js에서는 여러 개의 스레드가 사용됨
- 자바스크립트가 비동기적으로 동작할 수 있는 이유는 자바스크립트는 자바스크립트 엔진으로만 돌아가는 것이 아니기 때문
- 자바스크립트 엔진 밖에서 자바스크립트 실행에 관여하는 요소 존재
- Web API
- Task Queue (Callback Queue)
- Event Loop
작업에 대한 정보와 콜백 함수
를 Web API에게 전달setTimeout
함수는 일정시간 이후 즉시 실행되는 함수가 아닌, Call Stack과 Task Queue의 상황이 고려해야하는 최소 일정 시간의 delay를 보장하는 함수라고 표현할 수 있음setTimeout
과 Promise
가 각각 Queue에 존재할경우 Microtask Queue인 Promise가 더 빨리 실행libuv
라이브러리를 사용하며, 이 libuv가 이벤트 루프를 제공console.log("Hi!"); // 1번
const timeout = () => console.log("5 Seconds Later"); // 2번
setTimeout(timeout, 5000); // 3번
console.log("Hello!"); // 4번
참고
https://velog.io/@jwlee134/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://www.notion.so/dooking/9c35f66df98e4ca1ba29afaf69ef7726
https://velog.io/@graphicnovel/JS-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://hudi.kr/%EB%B9%84%EB%8F%99%EA%B8%B0%EC%A0%81-javascript-%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9C-%EA%B8%B0%EB%B0%98-js%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EB%B2%95/