티스토리 뷰
https://www.notion.so/simsimjae/9-e61ca697d9eb4094a55267d11cffe399
아래 글들은 검색엔진 노출을 위한 글입니다.
노션에서 확인하시면 이미지와 함께 정리된 글을 보실수 있습니다. 궁금하신점은 블로그 댓글이나 노션 코멘트를 이용해주세요(@comment)
제가 직접 만든 프로젝트입니다.
http://pickvs.com : 닥전닥후
Q&A
자바스크립트는 싱글스레드인데, 어떻게 비동기 처리가 가능한거지?
- 자바스크립트 자체에서 비동기 처리를 하는게 아니라 브라우저의 도움을 받는다.
- 자바스크립트는 비동기 요청문을 보면 그걸 자기가 실행하는게 아니라 브라우저API를 사용해서 브라우저에게 비동기 처리를 맡겨버린다.
- 비동기 처리는 브라우저 내부의 자바스크립트 코어 상위단에서 일어나게 된다.
브라우저 내부를 살펴보자
힙
- 객체, 변수등이 이곳에 저장된다.
스택
- 함수를 호출하면 스택에 프레임이 생긴다. 자바스크립트는 스택에 있는 함수들을 순차적으로 처리한다. (동기적으로)
브라우저API
- 웹 브라우저에 내장된 API
- 자바스크립트 코어 상위에 존재하고, 이것 덕분에 우리가 JS만으로 할 수 없는 일들을 추가로 할 수 있게된다.
- 이 브라우저 API는 복잡한 C++코드로 짜여져 있음
코드에 대한 깊은 이해
function main() { console.log('A'); setTimeout( function display() { console.log('B'); } , 0); console.log('C'); } main(); //A, C, B 순서로 출력
위 코드가 실행되면 어떤일이 펼쳐지는지 자세히 살펴보자.
-
먼저 main함수가 콜스택에 삽입된다.
-
main함수가 실행되고 console.log('A'); 구문이 실행되어 콘솔에 A가 찍힌다.
-
setTimeout함수가 실행되는데 이 함수는 브라우저에게 0초 뒤에 display() 콜백함수를 실행시켜달라는 명령이다.(자바스크립트 코어 → 브라우저)
-
브라우저는 명령을 받자마자 0초가 지나서 콜백함수를 큐에 삽입한다.
-
JS엔진은 그 다음 문장인 console.log('C');를 콜스택에 삽입하고 실행시킨다. 따라서 콘솔에 C가 찍힌다.
-
그리고 브라우저는 콜스택이 비워졌으므로 큐에 있는 콜백함수 display()를 콜스택에 삽입한다.
-
JS엔진은 콜스택에 삽입된 display()콜백함수를 실행한뒤, 실행이 끝나면 스택에서 pop해버린다.
-
그림으로 보면 다음과 같은 과정들이 일어난다.
setTimeout( function, delay ) : 정확히 delay시간 후에 function을 실행하지 않는다. 여기서의 delay는 최소 대기 시간을 의미한다. 즉, 최소한 delay만큼은 기다려야 함수가 실행될거라는거다. delay보다 더 오랜 시간이 걸릴 수 있는데 그건 누구도 장담하지 못한다. 그냥 브라우저가 delay이후에 콜백함수를 큐에 넣어줄뿐이다. 그 후에 콜스택이 비워져있어야 큐에 있는 콜백함수가 스택으로 삽입되어 실행된다.
코드에 대한 더 깊은 이해
function main() { console.log('A'); setTimeout( function exec() { console.log('B'); } , 0); runWhileLoopForNSeconds(3); console.log('C'); } main(); function runWhileLoopForNSeconds(sec) { let start = Date.now(), now = start; while (now - start < (sec*1000)) { now = Date.now(); } } // A C B 출력
- main()이 콜스택에 올라와서 실행됨
- setTimeout이 실행되어 exec콜백을 브라우저에게 전달 ⇒ 브라우저는 0초뒤 바로 큐에 콜백 삽입
- runWhileLoopForNSeconds 함수가 콜스택에 push되고 실행됨 → 3초간 콜스택에서 상주하며 메인스레드에서 실행됨. → 다른 함수들의 실행을 막는다 하여 이런 함수를 blocking statement라고 불림.
- runWhileLoopForNSeconds가 끝나면 console.log('C'); 실행
- 콜스택이 비어서 큐에서 기다리던 exec()콜백이 스택으로 push된 후 실행됨.
중요!! setTimeout의 delay는 최소 이정도는 기다려라의 의미이다. 절대로 "정확히 delay시간 후에 이 함수 실행시켜주세요." 가 아니다.
'Javascript' 카테고리의 다른 글
#11 V8엔진이 JS를 기계코드로 바꾸는 방법 (0) | 2019.09.25 |
---|---|
#10 스케쥴링 : setTimeout과 setInterval의 깊은 이해 (0) | 2019.09.25 |
Event Emitter를 언제 사용해야 할까? (0) | 2019.09.15 |
#8 IIFE(즉시호출함수표현식) (2) | 2019.07.29 |
#7 문장 vs 표현식 (3) | 2019.07.29 |
- Total
- Today
- Yesterday
- hydrate
- return type
- react hooks
- javascript
- async
- reactdom
- mobx
- reflow
- computed
- Action
- Next.js
- useEffect
- state
- design system
- props
- server side rendering
- type alias
- await
- reducer
- react
- promise
- Babel
- useRef
- webpack
- atomic design
- typescript
- rendering scope
- es6
- Polyfill
- storybook
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |