자바스크립트 엔진에는 크게 콜스택과 힙이있다. 콜스택이란 함수나 코드 들이 실행이되면 콜스택에 쌓이게된다. 하나의 콜스택만 가지고 있으므로 최상위 콜스택의 실행이 종료되어 제거가 되기 전까지 다음 작업이 이뤄지지 않는다. 힙은 객체가 저장되어지는 메모리 공간이고 구조화가 되어 있지 않다. 자바스크립트 엔진은 이렇게 단순히 콜스택과 힙으로만 구성되어있어 단순히 순차적으로 작업한다. 비동기 처리는 코드를 실행을 제외한 모든 처리들 (호출 스케쥴링)은 브라우저 환경 또는 Node.js가 해결한다.
함수가 실행이되면 자바스크립트 엔진 콜스택에 순차적으로 쌓이게되고 Web API로 받아온 요청들은 테스크 큐에 쌓이게된다. Event loop는 콜스택에 작업이 있는지 그리고 태스크 큐에 대기중인 함수가 있는지 계속해서 확인한다. 콜스택에 처리할 작업이 없으면 태스크 큐에있는 작업을 콜스택으로 이동시킨다.
rest syntax 는 변수 타입과는 상관없이 함수 외부의 인자를 매개 변수로 전달받을때 인자의 개수에 상관없이 한번에 여러개를 받을 수 있고 배열형태로 바뀌어진다. (rest 파라메터는 함수에 전달된 인수들의 목록들을 배열로 전달 받기 위해 사용). spread Syntax란 object 타입에 적용할 수 있는다 (iterable에만 적용가능). 각 element에 접근 할 수있고 주로 배열을 합치거나 객체의 프로퍼티를 변경,수정 할 때 사용한다.
Blocking 과 Non-Blocking은 동기와 비동기에 의해 발생한다.
Blocking 은 동기적 처리가 되었을 경우 발생한다. 동기적 처리란 작업을 순서대로 하나씩 처리하는 방식이며 현재 작업이 종료되면 다음 작업이 처리된다. A 작업을 처리하는 시간이 길어지면 다음 작업인 B가 대기하는 시간이 길어진다. 이때 B는 A실행이 종료된 이후 호출되는데 B는 A에 의하여 blocking이 되었다 라고 말할 수 있다.
Non-Blocking은 비동기적 처리가 되었을때 발생한다. Blocking과는 반대로 하나의 작업이 종료될때까지 다음 작업이 대기하는 것이아니고, 하나의 작업이 실행하는 동시에 다음 작업이 호출이 된다. 이를 Non-Blocking 이라고 할 수 있다.
Synchronous execution는 동기적으로 코드가 항상 순차적으로 진행이 되어 작업이 종료될때 결과물을 가져온다. Asynchronous execution는 비동기적으로 순서가 항상 정해져있지 않고 비동기 처리 방식에 따라 순서가 정해진다. 순서에 신경쓰지않고 작업이 종료되면 그때 결과물을 가져온다.
자바엔진은 단 하나의 실행 컨텍스트 스택을 가지고있어서 한번에 두개 이상의 함수를 동수에 처리할 수 없고 한번에 하나의 함수만 처리 할 수 있다. 한번에 하나의 작업을 하는 것을 싱글스레드 방식 이라고한다. Javscript 가 이에 해당한다. 브라우저 안에는 자바스크립트 엔진이 있다. 브라우저 안에 내장되어있는 자바스크립트 엔진은 싱글 스레드로 동작하지만 브라우저는 멀티 스레드로 동작한다. 만약 모든 작업이 자바스크립트 싱글스레드로 동작하게 된다면 비동기 작업은 되지 않을 것이다.
Event Driven 이란 '사건' 기반으로 아키텍쳐가 설계된 것. 이벤트가 발생 할때 또 다른 일이 발생하게하는 것 이라고 할 수 있다. 예를 들어 키보드, 마우스 를 동작하여 어떠한 작업이 실행 되게 하는것. 자바스크립트도 이처럼 event -driven 이라고 할 수 있다. 어떤 이벤트(상태변화)가 발생하는지 지켜보고 있다가 이벤트가 발생했을때 이벤트 발생에 해당한 작업 (콜백함수 또는 함수)을 실행 한다.