"싱글 스레드 기반으로 동작하는 Javascript" "이벤트 루프를 기반으로 하는 싱글 스레드 Node.js"

구글에서 개발한 V8을 비롯해 대부분의 Javascript Engine은 크게 다음의 세 영역으로 나뉜다.

Call Stack

Javascript는 **단 하나의 호출 스택(**call stack)을 사용한다. 이러한 특징 때문에 Javascript의 함수가 실행되는 방식을 “Run to Completion” 라고 한다. 이는 하나의 함수가 실행되면 이 함수의 실행이 끝날 때까지 다른 어떤 task도 수행될 수 없다는 의미이다. 요청이 들어올 때마다 해당 요청을 순차적으로 호출 스택에 담아 처리한다. method가 실행될 때, Call Stack에 새로운 프레임이 생기고 push되고 method의 실행이 끝나면 해당 프레임은 pop되는 원리이다.

function foo(b) {
    var a = 10;
    return a + b;
}

function bar(x) {
    var y = 2;
    return foo(x + y);
}

console.log(bar(1));

위 코드는 아래와 같이 작동한다.

Heap

동적으로 생성된 객체(instance)는 힙(heap)에 할당된다. 대부분 구조화되지 않는 ‘더미’같은 메모리 영역을 heap이라 표현한다.

Task Queue(Event Queue)

Javascript의 Runtime환경에서는 처리해야 하는 Task들을 임시 저장하는 대기 큐가 존재한다. 그 대기 큐를 Task Queue or Event Queue라고 한다. 그리고 Call Stack이 비었을 때 먼저 대기 열에 들어온 순서대로 수행된다.

setTimeout(function() {
    console.log("first");
}, 0);
console.log("second");

// second
// first

Javascript에서 비동기로 호출되는 함수들은 Call Stack에 쌓이지 않고 Task Queue에 enqueue된다.

예 ) setTimeout, setInerval, ajax, eventHandler