[이벤트 루프 구조]

// 브라우저의 루프
while(queue.waitForMessage()){
  queue.processNextMessage();
}

// queue.waitForMessage() 함수는 현재 아무 메시지도 없다면 새로운 메시지 도착을 동기적으로 기다립니다.
// 웹 브라우저에서 이벤트 리스너가 부착된 이벤트가 발생할 때마다 메시지가 추가됩니다.
// 리스너가 없으면 이벤트는 손실됩니다. 클릭 이벤트 핸들러가 있는 요소를 클릭하면
// 다른 이벤트와 마찬가지로 메시지가 추가됩니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/521bfb0e-fd5c-4e2e-8459-5b000ec8626d/Untitled.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c5ac9cfd-fef3-4615-aa2d-e9fd8fa6c42b/Untitled.png

[Callstack]

Execution Context

[TaskQueue]

// case1
function counter() {
  let answer = 0;
  let i;
  for (i = 1; i < 5; i += 1) {
    console.log("out i", i);
    setTimeout(() => {
      answer += i; // 할당된 i 는 for문 밖의 변수 i
      console.log("in i", i);
      console.log("answer", answer);
    }, 0);
  }
  console.log("direct result", answer);
  setTimeout(() => console.log("lazy result", answer), 0);
}

counter();

// Variables declared with var are not local to the loop,
// i.e. they are in the same scope the for loop is in

// case2 let이 for 안에 있을때
....
for (let i = 1; i < 5; i += 1) { // i가 loop안의 지역변수가 된다
    console.log("out i", i);
    setTimeout(() => { // 할당된 i 는 for문 안의 특정시점 블록의 변수 i
...

// case3 var가 for 안에 있을때
....
for (var i = 1; i < 5; i += 1) {
    console.log("out i", i);
    setTimeout(() => {
...

[Microtask queue]