
자바스크립트 런타임환경이란 말그대로 자바스크립트 언어가 실행되는 환경을 의미한다.

프로세스란 운영체제 위에서 실행되는 프로그램들을 말한다.

스레드는 프로세스 안에서 자신만의 호출되어야하는 함수를 받는 stack을 가지고 존재하며 역할에 따라 1개 이상 존재 할 수 있다.

js 엔진에는 크게 memory heap과 call stack이 있다.

WEB APIs는 대표적으로 DOM API,eventListenr, setTimeout, fetch ,ajax등이 있다.

<body>
<button>Continue with SetTimeout</button>
<script>
const btn =document.querySelector('button');
btn.addEventListener('click',()=>{
handleClick();
})
function handleClick(){
console.log('handleClick');
setTimeout(()=>{
console.log('setTimeout');
},1000);
}
</script>
</body>
이벤트 루프는 계속해서 자바스크립트 런타임 환경을 돌면서 콜스택과 테스크큐를 계속해서 감시하고 콜스택이 자리가 나면 테스크 큐에게 알린다.

js runtime environment의 queue에는 task queue외에도 microtask queue, Render안에 RAF(request Animation Frame)의 queue)로 구성되어 있다.
event loop는 보통 1ms의 속도로 런타임 환경을 순회하고 브라우저는 contents를 60fps(16.7ms)의 속도로 보여준다.
따라서 event loop는 순회할 때마다 render로 가서 코드들을 업그레이드 해줄 필요가 없이 종종 업그레이드가 필요할 때만 들린다.
btn.addEventListener('click',()=>{
requestAnimationFrame(()=>{
document.body.style.backgroundColor="red";
}),
requestAnimationFrame(()=>{
document.body.style.backgroundColor="blue";
}),
requestAnimationFrame(()=>{
document.body.style.backgroundColor="orange";
}),
})
콜백함수안에 반복되는(반복문, 재귀함수)것들을 사용하면 브라우저가 죽을 수 있으므로 주의해야한다.
btn.addEventListener('click',()=>{
while(true){
// repeat error!
}
})