🤔 함수 실행 컨텍스트와 실행 컨텍스트 스택
- 함수를 호출하면 함수 코드가 평가되어 함수 실행 컨텍스트가 생성됩니다. 실행 컨텍스트 스택(= 콜 스택)에 푸쉬되고 함수 코드를 실행합니다.
- 실행 종료시 실행 컨텍스트 스택에서 팝되어 제거됩니다.
const foo = () => {};
const bar = () => {};
foo();
bar();✅ 자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택을 가집니다. 따라서, 동시에 2개 이상의 함수를 실행할 수 없습니다.
✅ 싱글 스레드 방식으로 동작합니다. 따라서, 처리에 시간이 걸리는 task를 실행하는 경우 블로킹(작업 중단) 이 발생됩니다.
// sleep 함수는 일정 시간(delay)이 경과한 이후에 콜백 함수(func)를 호출한다.
function sleep(func, delay) {
const delayUntil = Date.now() + delay;
// 현재 시간(Date.now())에 delay를 더한 delayUntil이 현재 시간보다 작으면 계속 반복한다.
while (Date.now() < delayUntil);
// 일정 시간(delay)이 경과한 이후에 콜백 함수(func)를 호출한다.
func();
}
function foo() {
console.log("foo");
}
function bar() {
console.log("bar");
}
// sleep 함수는 3초 이상 실행된다.
sleep(foo, 3 * 1000);
// bar 함수는 sleep 함수의 실행이 종료된 이후에 호출되므로 3초 이상 블로킹된다.
bar();
// (3초 경과 후) foo 호출 -> bar 호출😀 동기 처리 (synchronous)
- 현재 실행 중인 태스크가 종료할 때까지 다음에 실행될 태스크가 대기하는 방식
- 실행 순서는 보장되지만, 앞선 태스크가 종료될 때까지 이후 태스크들이 블로킹됩니다.
🤔 비동기 처리
- 현재 실행 중인 태스크가 종료되지 않는 상태라도 다음 태스크를 곧바로 실행하는 방식
- 실행 순서는 보장되지 않지만, 블로킹이 발생되지 않습니다.
setTimeout,setInterval, HTTP 요청, 이벤트 핸들러- 콜백 패턴의 문제성 -> 45절 프로미스
function foo() {
console.log("foo");
}
function bar() {
console.log("bar");
}
// 타이머 함수 setTimeout은 일정 시간이 경과한 이후에 콜백 함수 foo를 호출한다.
// 타이머 함수 setTimeout은 bar 함수를 블로킹하지 않는다.
setTimeout(foo, 3 * 1000);
bar();
// bar 호출 -> (3초 경과 후) foo 호출브라우저가 동작시 테스크가 동시에 처리되는 것처럼 느껴집니다. 😀 자바스크립트의 동시성을 지원 하는 이벤트 루프
🤔 콜 스택
- 실행 컨텍스트 스택
- 생성된 실행 컨텍스트가 추가되고 제거되는 스택 자료구조를 의미합니다.
🤔 힙
- 객체가 저장되는 메모리 공간
- 비구조화 : 할당해야할 메모리 공간의 크기를 런타임에 결정(동적할당)합니다.
비동기 처리에서 소스코드 평가와 실행 외에는 자바스크립트 엔진을 구동하는 환경인 브라우저 또는 Node.js가 담당합니다.
✅ 이를 위해 태스크 큐와 이벤트 루프를 제공합니다.
🤔 테스트 큐
- 비동기 함수의 콜백 함수 또는 이벤트 핸들러가 일시적으로 보관되는 영역
🤔 이벤트 루프
- 콜 스택에 현재 실행 중인 실행 컨텍스트와 태스크 큐에 대기중인 함수 유무를 반복해서 확인하는 역할.
- 콜 스택이 비어 있고 태스크 큐에 대기중인 함수가 있을 시 순차적(
FIFO)으로 이동합니다.
function foo() {
console.log("foo");
}
function bar() {
console.log("bar");
}
setTimeout(foo, 0); // 0초(실제는 4ms) 후에 foo 함수가 호출된다.
bar();- 전역 코드가 평가되어 전역 실행 컨텍스트가 생성되고 콜 스택에 푸쉬됩니다.
- 전역 코드 실행시
setTimeout함수를 호출합니다. 이때setTimeout함수의 함수 실행 컨텍스트가 생성되고 콜스택에 푸쉬되어 현재 실행 중인 실행 컨텍스트가 됩니다. 😀 브라우저 역할: 실행 컨텍스트 생성
setTimeout실행시 콜백 함수를 호출 스케줄링 후 종료되어 콜 스택에서 팝됩니다. 😀 브라우저 역할: 타이머 설정과 타이머 만료시 콜백 함수를 태스크 큐에 푸쉬
- 다음 과정이 병행 처리 됩니다. (태스트 큐)
- 지연 시간이 4ms 이하인 경우 최소 지연 시간 4ms이 지정되어, 4ms 후에 콜백 함수 foo가 태스크 큐에 푸쉬되어 대기 . 이후 콜 스택이 비면 호출 😀 브라우저 역할: 타이머 설정, 타이머 만료 대기
- bar 함수 호출되어 실행 컨텍스트가 생성되고 콜 스택에 푸쉬되어 현재 실행 중인 실행 컨텍스트가 됩니다. 이후 종료시 콜 스택에서 팝됩니다. 😀 브라우저가 타이머를 설정한 후 4ms가 경과되었다면 foo 함수는 아직 태스크 큐에서 대기 중 입니다.
- 전역 코드 실행이 종료되고 전역 실행 컨텍스트가 콜 스택에서 팝됩니다.
✅ 비동기 함수는 태스크 큐에 푸쉬되어 대기 하다 콜 스택이 비게 되면, 전역 코드 및 명시적으로 호출된 함수가 모두 종료되면 콜 스택에 푸쉬되어 실행 됩니다.
✅ 자바스크립트 엔진은 싱글 스레드로 동작 하지만 브라우저는 멀티 스레드로 동작 합니다.

