이전 글에서
소스 코드가 평가되면 실행 컨텍스트가 생성되고, 실행 컨텍스트가 실행 컨텍스트 스택에 쌓인다. 그리고 실행 컨텍스트 스택을 통해서 코드 실행 순서를 관리한다.
자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택을 갖는다. -> 동시에 2개 이상의 함수를 실행할 수가 없다!! 실행 컨텍스트 스택 최상위에 있는 컨텍스트만이 실행되는 태스크 (싱글 스레드)
싱글 스레드 방식은 한 번에 하나의 태스크만 실행할 수 있다.
블로킹
이 발생한다동기 처리는 실행 순서가 보장되지만, 블로킹 되는 단점이 있다.
비동기 처리는 블로킹이 발생하지 않지만, 실행 순서가 보장되지 않는다.
자바스크립트의 동시성을 지원하는 것이 이벤트 루프
이벤트 루프는 브라우저
에 내장되어 있는 기능이다!
대부분의 자바스크립트 엔진은 크게 2개의 영역으로 구분이 가능하다
콜 스택
: 실행 컨텍스트 스택힙
: 객체가 저장되는 메모리 공간, 실행 컨텍스트는 힙에 저장된 객체를 참조비동기 처리에서 소스 코드의 평가와 실행을 제외한 모든 처리는 브라우저
또는 node.js
가 담당
ex) setTimeout의 콜백 함수의 평가와 실행은 자바스크립트 엔진이 담당하지만, 타이머 설정과 콜백 함수 등록은 브라우저 또는 node.js가 담당
-> 이를 위해 브라우저는 태스크 큐
와 이벤트 루프
를 제공한다.
태스크 큐
: 비동기 함수의 콜백 함수
나 이벤트 핸들러
가 일시적으로 저장됨이벤트 루프
: 콜 스택에 현재 실행중인 실행 컨텍스트가 있는지, 태스크 큐에 대기 중인 함수가 있는지 반복해서 확인 -> 콜 스택이 비어 있고, 태스크 큐에 대기 중인 함수가 있으면, 이벤트 루프는 태스크 큐에 대기 중인 함수를 콜 스택으로 이동시킨다.브라우저와 자바스크리트 엔진이 협력하여 비동기 함수를 실행한다!!