"싱글 스레드 기반으로 동작하는 Javascript" "이벤트 루프를 기반으로 하는 싱글 스레드 Node.js"
구글에서 개발한 V8을 비롯해 대부분의 Javascript Engine은 크게 다음의 세 영역으로 나뉜다.
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));
위 코드는 아래와 같이 작동한다.
동적으로 생성된 객체(instance)는 힙(heap)에 할당된다. 대부분 구조화되지 않는 ‘더미’같은 메모리 영역을 heap이라 표현한다.
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