\=> 객체, 배열들이 담긴다.
Task Queue, Event Queue 라고도 불린다.
비동기 처리가 끝난 후 실행되어야 할 콜백함수가 차례로 할당된다.
function one(){
two();
console.log("first");
}
function two(){
console.log("two");
}
one();
다음과 같은 코드가 있다고 해보자.
이 코드를 실행 시키면 CallStack에는 어떤 변화가 있을까?
코드의 전체 내용을 담고 있는 anonymous 가 Call Stack 에 먼저 들어옴.
먼저 호출된 함수 one이 Call Stack에 들어옴.
함수 one 안에서 호출된 함수 two가 Call Stack 에 들어옴.
console.log("two")가 Call Stack에 들어온 후 실행되고 빠져나감.
함수 two가 빠져나감.
함수 one 안에 있던 console.log("first")가 Call Stack에 들어온 후 실행되고 빠져나감
함수 one이 빠져나감.
anonymous가 빠져나감
종료
와 같은 순서로 코드가 실행된다.
위와 같이 코드를 동기적으로 실행하며 호출 순서대로 함수와 함수 스코프 내에 있는 코드들이 Call Stack에 쌓이면서 빠져나간다.
Call Stack 에는 정해진 사이즈가 잇다.
=> 이 때, 바로 코딩하다가 의외로 많이 마주쳤던
Maximum call stack size exceeded
라는 에러가 발생하는 것이다.
이벤트 루프는 브라우저나 Node.js와 같은 환경에서 실행되는 자바스크립트 코드에서 발생하는 모든 이벤트를 처리하고, 콜백 함수(callback function)을 실행하는 루프(loop)이다.
JS Event Loop에서는 비동기적 코드를 처리하는 것이 제일 중요한 개념이다.
console.log('one');
setTimeout(function (){
console.log('two');
}, 3000);
console.log('three');
위와 같은 코드가 있다고 가정해보자. Call Stack과 Task queue는 어떤 식으로 위의 코드를 처리할까?
Call Stack에 anonymous가 들어온다.
Call Stack에 console.log('one')이 들어와 실행된 후 빠져나간다.
Call Stack에 setTimeout 함수가 들어온다.
setTimeout함수는 비동기 처리 함수이기 때문에 Call Stack에서 빠져나와 Web api로 이동한다.
현재 setTimeout의 두번째 인자는 3초 이기때문에 Web Api에서 3초를 기다리고 있다.
Call Stack에 console.log('three')가 들어온 후 실행되고 빠져나간다.
Call Stack에서 anonymous가 빠져나간다.
Web Api에서 3초가 지난 후 setTimeout의 콜백함수가 task queue(callback queue)로 이동한다.
그리고 EventLoop가 Call Stack이 비어있는지 검사한다.
비어있다면 익명의 콜백함수를 Call Stack으로 보낸다.
익명 함수 내에 있는 console.log('중간')이 Call Stack에 쌓인 후 실행되고 빠져나간다.
익명 함수가 빠져나간다
종료
=> JS의 코드 처리 방식을 알고 있다면 클린하고 효율성 좋은 코드를 짤 수 있을 것 같다고 생각했다.