이 포스트는 여러 블로그에서 참조한 내용을 제가 이해한대로 정리해보았습니다. 

참고한 블로그 : https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf

https://tristy.tistory.com/51

혹시 제가 잘못 이해한 내용이 있다면 댓글 부탁드립니다.

 

동기(synchronuous) : 함수 A가 함수 B를 호출하고 B의 작업이 끝나야 A작업을 할 수 있음 

비동기(Asynchronuous) : 함수 A가 함수 B를 호출하고 B의 작업은 신경쓰지 않고 자신의 코드를 계속 실행. B의 작업이 끝나면 콜백 함수 실행 (너 작업 끝나면 불러라 ~)

Stack :  차곡차곡 쌓아 올린 자료 구조이기에 제일 먼저 들어온 데이터는 밑으로 간다 . 후입선출


 

https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf1

JS는 싱글스레드이다 하나의 Call Stack을 가지고 있어서 한 번에 하나의 명령어만 실행된다

-> 한 번에 여러가지를 못하고 하나씩만 처리함 -> JS는 싱글스레드, 동기식 언어

 

??? JS는 비동기 아니야? 

비동기 작업을 수행하기 위한 존재들(웹 브라우저 or Runtime에서 지원)

- Web API :IO에 관련된 로직(addEventListener, setTimeout, Ajax)를 처리(https://developer.mozilla.org/ko/docs/Web/API)

- Callback Queue : API에서 처리하고 난 뒤 Callback들이 담김

- Event Loop : Callback Queue에 있는 콜백들을 Call Stack 에 올려서 실행

Call Stack 이 비어있는 경우에만 Event Loop는 콜스택에 콜백 큐의 로직들을 올려 실행

 

이런 도움들을 받아서 비동기작업을 처리한다. (처리부분은 https://tristy.tistory.com/51 에서 그림으로 자세히 볼 수 있음)

function foo() {
  console.log("1");
}

function foo2() {
  console.log("2");
}

foo();
setTimeout(function () {
  console.log("3");
}, 2000);
foo2();

foo() Call stack에서 차례대로 진행함

setTimeout 함수를 호출함, 비동기 함수이기 때문에 WebAPI에서 처리한다.

foo2()는 setTimeout과 상관없이 Call stack으로 들어감

setTimeout의 시간이 지난 뒤 콜백 함수를 Callback Queue로 보낸다

Event Loop는 Callback Queue에 있는 콜백 함수를 Call stack으로 보내기 위해서 Call stack이 비어있는지 검사 

-> Call stack이 작업중이라면 블럭킹 된다

비어있다면 Callback Queue에 있던 setTimeout을 Call stack으로 보내서 처리

+ Recent posts