「프론트엔드 개발자를 위한 자바스크립트 프로그래밍」 서적을 참조했으며, 4장에 대한 요약 및 정리를 진행하려고 한다.
변수
원시값 | 참조값 |
- 단순한 데이터 - 값으로 접근 - 동적 프로퍼티 생성 X - 다른 변수로 값을 복사할 때, 현재 저장된 값을 새로 생성한 다음 새로운 변수에 복사 |
- 객체 - 자바스크립트는 메모리 위치에 직접 접근하는 것을 허용하지 않음 -> 참조를 조작 - 동적 프로퍼티 생성 O, 메서드 생성 O - 다른 변수로 복사할 때, 현재 저장된 참조 레퍼런스를 새로운 변수에 복사 |
instanceOf
- typeof는 원시 값에 대해서는 잘 동작하지만, 참조 값에 대해서는 유용하지 않음
- 참조 값에 대한 참조 타입을 판단하기 위해 사용
실행 컨텍스트
- 전역 컨텍스트, 함수 컨텍스트, eval()을 통해 생성 가능하다
- 각 실행 컨텍스트에는 변수 객체(활성 객체)가 연결되어 있다 (컨텍스트에서 정의된 변수, 함수도 존재)
- 가장 바깥쪽에 존재하는 실행 컨텍스트는 전역 컨텍스트 (웹 브라우저 - window)
- 전역 변수와 함수는 모두 window 객체의 프로퍼티 및 메서드로 생성
- 포함된 코드가 모두 실행될 때 사라짐(컨텍스트 내부에서 정의된 변수, 함수도 포함)
- 애플리케이션이 종료될 때 전역 컨텍스트가 사라짐
- 함수 호출시 독자적인 실행 컨텍스트가 생성
- 함수로 들어갈 때마다 함수의 컨텍스트가 컨텍스트 스택에 쌓임
- 함수 실행이 끝나면 해당 컨텍스트는 POP & 이전 컨텍스트에 컨트롤 반환
- 컨텍스트가 함수라면 활성화 객체를 변수 객체로 사용
- 변수에 할당된 메모리를 언제 해제할 수 있는지 판단하는데 도움이 된다
스코프 체인
- 컨텍스트에서 코드를 실행하면 변수 객체에 "스코프 체인" 생성
- 실행 컨텍스트가 접근할 수 있는 모든 변수와 함수에 순서를 정의하는 것
- 스코프 체인의 앞쪽은 항상 코드가 실행되는 컨텍스트의 변수 객체
- 다음 순서로는 해당 컨텍스트를 포함하는 부모 컨텍스트 (전역 컨텍스트에 도달할 때까지 진행)
- "각 컨텍스트는 스코프 체인을 따라 상위 컨텍스트(밖)에서 변수나 함수를 검색할 수 있지만, 스코프 체인을 따라 내려가며 검색은 불가능하다"
스코프 체인 확장
- 특정 문장의 경우 스코프 체인 앞쪽에 임시로 변수 객체를 만들고, 코드 실행이 끝나면 사라지게 하는 임시 객체 생성
- try - catch문의 catch 블록
- with 문
가비지 컬렉션
- 자바 스크립트에서는 필요한 메모리를 자동으로 할당하고 더 이상 사용하지 않는 메모리는 자동으로 회수
- 개발자가 직접 메모리 관리를 하지 않아도 됨
- 주기적으로 실행
- 코드 실행 중에 특정 시점에서 메모리를 회수하도록 지정할 수 있음
- 더이상 사용하지 않는 변수를 식별하는 기준은 크게 2가지
- 표시하고 지우기
- 가장 널리 사용
- 가비지 컬렉터가 작동하면 메모리에 저장된 변수 전체에 표시를 남김
- 그 다음, 컨텍스트에 있는 변수와 컨텍스트에 있는 변수가 참조하는 변수에서 표시를 지움
- 이후에 표시가 그대로 남아있는 변수는 컨텍스트에 있는 변수와 무관 -> 삭제해도 안전
- 가장 널리 사용
- 참조 카운팅
- 각 값이 얼마나 많이 참조되었는지 추적
- 참조 카운트가 0인 곳의 메모리를 회수
- 순환 참조로 인한 문제점 발생
- 표시하고 지우기
- 가비지 컬렉터를 실행하는 것 역시 비용이므로 실행하는 타이밍이 중요하다
메모리 관리
- 자바 스크립트라는 환경에서 메모리 관리와 가비지 컬렉션은 다른 환경과 매우 다르다
- 최적화하는 좋은 방법으로 코드 실행에 필요한 데이터만 유지하는 것이다
- 필요하지 않은 데이터는 null을 할당해 참조를 제거하는게 좋다 (주로 전역 변수, 전역 객체의 프로퍼티)
'Tech > Javascript' 카테고리의 다른 글
자바스크립트 프로그래밍 3장 (언어의 기초) - 3.6~3.8 (0) | 2020.05.01 |
---|---|
자바스크립트 프로그래밍 3장 (언어의 기초) - 3.5 (0) | 2020.04.29 |
자바스크립트 프로그래밍 3장 (언어의 기초) - 3.1 ~ 3.4 (0) | 2020.04.27 |
자바스크립트 프로그래밍 2장 (Html 속의 자바스크립트) (0) | 2020.04.24 |
자바스크립트 프로그래밍 1장 (0) | 2020.04.23 |