//1 호출 스택(동기)
function first (){
second();
console.log("첫번째");
}
function second(){
third();
console.log("두번째");
}
function third(){
console.log("세번째");
}
first();
// 위 코드 순서 예측해보기
// 세번째 -> 두번째 -> 첫번째

호출 스택 (함수의 호출, 자료 구조의 스택)
Anonymous은 가상의 전역 컨텍스트(항상 있다고 생각하는게 좋음)
(Anonymous : 크롬에서 실행하면 쌓이게 되는 것. 파일이 시작되면 생기고 끝나면 사라짐)
함수 호출 순서대로 쌓이고, 역순으로 실행됨
(함수안에 함수가 있을 때 스택에 쌓이게 됨. first()가 끝나고 second()가 실행되면 쌓이지 않음)
함수 실행이 완료되면 스택에서 빠짐
LIFO구조라서 스택이라고 불림
※ LIFO(Last in First Out) : 후입선출
자바스크립트가 동기적으로 어떻게 실행되는지 파악할 수 있는 것이 호출 스택
// 2 이벤트 루프(비동기)
function run(){
console.log("3초후 실행");
}
console.log("start");
setTimeout(run, 3000);
console.log("end");
// 위 코드 순서 예측해보기
// start -> end -> 3초후 실행
// 호출 스택만으로는 설명이 안됨(run은 호출 안했는데?)
// 호출 스택 + 이벤트 루프로 설명할 수 있음.
이벤트 루프


// 이벤트 루프 훈련
function oneMore(){
console.log("one more");
}
function run(){
console.log("run run");
setTimeout(()=>{
console.log("wow")
}, 0)
new Promise((resolve)=>{
resolve("hi");
})
.then(console.log);
oneMore();
}
setTimeout(run,5000);
// 위 코드 순서 예측해 보기
// run run -> one more -> hi -> wow
// promise.then/catch or process.nextTick은
// setTimeout 보다 우선순위이기에 태스크 큐에서 호출 스택으로 먼저 이동하여 호출된다.