티스토리 뷰
목차
1. 자바스크립트 엔진
2. 엔진 동작 원리
3. 런타임
4. 콜 스택, 메모리 힙의 데이터 저장 구조
1. 자바스크립트 엔진
- 자바스크립트 엔진: 자바스크립트 코드를 실행하는 프로그램 또는 인터프리터(해석기). 대체적으로 웹 브라우저에서 사용된다.
- ex. V8 Engine: 구글 크롬 혹은 Node.JS에서 작동하는 자바스크립트 엔진이다. V8 이 외에도 각각의 브라우저마다 다른 자바스크립트 엔진이 존재한다.
- 엔진에 의한 인터프리터 방식이기 때문에 별도의 컴파일 과정이 필요없다. ( 웹브라우저에서 즉시 해석되어 실행됨 = 런타임 )
2. 자바스크립트 엔진 동작 원리
- 모든 자바스크립트 엔진에는 Call Stack 과 Memory Heap의 영역이 존재한다.
- 엔진의 주요 구성요소
▶ Memory Heap
- 메모리 할당이 일어나는 곳(구조화되지 않은 메모리 풀임)
- 참조타입(객체, 배열, 함수 등) 데이터가 저장됨
▶ Call Stack
- 코드가 실제로 실행되는 곳
- 원시 타입(문자(string), 숫자(number), bigint, 불리언(boolean), null, undefined, 심볼(symbol) => ES6부터 추가된 타입) 데이터가 저장됨
- 실행 콘텍스트(Execution Context)를 통해 다음과 같은 일을 수행함
- 변수 식별자(이름)저장
- 스코프 체인 및 this 관리
- 코드 실행 순서 관리 등을 수행
* 자바스크립트는 single thread 프로그래밍 언어이다. 이 의미는 Call Stack이 하나라는 얘기이며 한 번에 한 작업만 처리할 수 있다.
* 호출 스택은 전역함수가 가장 먼저 호출 된 후 지역함수가 순차적으로 쌓인다.
(전역함수= 함수 외부에서 선언된 변수. 프로그램 전체에서 접근할 수 있는 변수
지역함수= 함수 내부에서 선언된 변수. 함수가 실행되면 만들어지고 함수가 종료되면 소멸함.)
* 함수의 실행이 끝날 때(리턴 값을 돌려줄 때), 해당 함수를 호출 스택에서 제거한다.(=스택의 역할)
* 호출 스택의 각 단계를 스택 프레임(Stack Frame)이라고 한다.
3. 런타임
- 자바스크립트 런타임이란, 자바스크립트를 사용하기 위한 모든 내용을 담고 있는 컨테이너라고 볼 수 있으며 예시로 브라우저를 들 수 있다. (자바스크립트 실행 환경이라고 불러도 무난하다)
- 따라서 자바스크립트 런타임에는 자바스크립트 엔진이 필수적이라 할 수 있다.
- 그러나 엔진만 있어서는 안되며, Web APIs 도 런타임 구성요소에 포함이 된다.
- Web API는 엔진에게 필요한 기능을 제공해주며, 윈도우 객체에 접근할 수 있도록 해준다.
- 또한, 런타임 구성요소에는 CALLBACK QUEUE 가 포함된다.
- CALLBACK QUEUE 는 실행 대기중인 모든 콜백 함수들을 갖고 있는 자료구조이다. ex) 이벤트 핸들러 등
4. 콜 스택, 메모리 힙의 데이터 저장 구조
1. 원시 타입 데이터(파란색 변수 a)
- 10이라는 값 자체는 원시 타입이므로 콜 스택에 저장된다.
- 변수 a에는 10이 저장된 콜 스택 메모리의 주소값이 저장된다.
* 변수 식별자 a 자체는 콜스택 상의 '실행 컨텍스트(Execution Context)의 렉시컬 환경(Lexical Environment)'이라는 곳에 저장된다.
2. 참조 타입 데이터(핑크색 변수 b, c, d)
- 배열, 객체, 함수 등은 참조 타입이므로 메모리 힙에 저장된다.
- 참조타입 데이터가 저장된 메모리 힙의 주소값은 콜스택에 각각 저장된다.
- 메모리힙의 주소 값이 저장된 콜 스택의 주소값은 각각 변수 b, c, d에 저장된다.
* 마찬가지로, 변수 식별자 b, c, d 이름 자체는 콜스택 상의 '실행 컨텍스트(Execution Context)의 렉시컬 환경(Lexical Environment)'에 저장된다.
예제
1. 아래의 코드는 콜스택에 어떻게 저장될까?
let age = 30;
let oldAge = age;
age = 31;
console.log(age); // 31
console.log(oldAge); // 30
age는 31이라는 값을 저장하기 위해 새 주소를 얻는다.
2. 아래의 코드는 콜스택과 메모리 힙에 어떻게 저장될까?
const me = {
name: 'Jonas',
age: 30,
};
const friend = me;
friend.age = 27;
console.log('Friend', friend);
// { name:'Jonas', age:27 }
console.log('Me', me);
// { name:'Jonas', age:27 }
me와 friend는 같은 주소를 공유하고 있기 때문에 다음과 같이 age를 27로 변경할 수 있다.
참고: https://charming-kyu.tistory.com/19
'Language > JavaScript' 카테고리의 다른 글
[Javascript] scope, scope chain (0) | 2022.07.08 |
---|---|
[Javascript] Javascript, 인터프리터 언어일까? (0) | 2022.07.07 |
[JavaScript] 함수 선언 방식(함수 표현식, 함수 선언식, 차이점) (0) | 2022.06.30 |
[Javascript] 삼항 연산자 (0) | 2022.06.29 |
[Javascript] 객체 object (0) | 2022.06.29 |
- Total
- Today
- Yesterday
- 배열
- javascript
- 코드잇스프린트
- 취업까지달린다
- GitHub
- CSS
- 중급 프로젝트
- react
- tanstackquery
- currentTarget
- 비제어 컴포넌트
- arguments
- hydrationboundary
- html
- 코드잇 스프린트
- map
- js
- rest parameter
- 스프린트프론트엔드6기
- innerhtml
- 제어 컴포넌트
- 유사배열객체
- Next.js
- 리액트
- 객체
- 프론트엔드
- Git
- 동기
- 비동기
- Target
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |