본문 바로가기
Tech/Javascript

자바스크립트 프로그래밍 4장 (변수와 스코프, 메모리)

by uyoo 2020. 5. 5.
「프론트엔드 개발자를 위한 자바스크립트 프로그래밍」 서적을 참조했으며, 4장에 대한 요약 및 정리를 진행하려고 한다.

 

변수

원시값 참조값

- 단순한 데이터
- 고정된 크기를 가지고, 스택 메모리에 저장

- 값으로 접근

- 동적 프로퍼티 생성 X

- 다른 변수로 값을 복사할 때, 현재 저장된 값을 새로 생성한 다음 새로운 변수에 복사

- 객체
- 힙 메모리에 저장

- 자바스크립트는 메모리 위치에 직접 접근하는 것을 허용하지 않음 -> 참조를 조작

- 동적 프로퍼티 생성 O, 메서드 생성 O 

- 다른 변수로 복사할 때, 현재 저장된 참조 레퍼런스를 새로운 변수에 복사

 


instanceOf

  • typeof는 원시 값에 대해서는 잘 동작하지만, 참조 값에 대해서는 유용하지 않음
  • 참조 값에 대한 참조 타입을 판단하기 위해 사용

실행 컨텍스트

  • 전역 컨텍스트, 함수 컨텍스트, eval()을 통해 생성 가능하다

  • 각 실행 컨텍스트에는 변수 객체(활성 객체)가 연결되어 있다 (컨텍스트에서 정의된 변수, 함수도 존재)
  • 가장 바깥쪽에 존재하는 실행 컨텍스트는 전역 컨텍스트 (웹 브라우저 - window)
  • 전역 변수와 함수는 모두 window 객체의 프로퍼티 및 메서드로 생성

  • 포함된 코드가 모두 실행될 때 사라짐(컨텍스트 내부에서 정의된 변수, 함수도 포함)
  • 애플리케이션이 종료될 때 전역 컨텍스트가 사라짐

  • 함수 호출시 독자적인 실행 컨텍스트가 생성
  • 함수로 들어갈 때마다 함수의 컨텍스트가 컨텍스트 스택에 쌓임
  • 함수 실행이 끝나면 해당 컨텍스트는 POP & 이전 컨텍스트에 컨트롤 반환
  • 컨텍스트가 함수라면 활성화 객체를 변수 객체로 사용

  • 변수에 할당된 메모리를 언제 해제할 수 있는지 판단하는데 도움이 된다

스코프 체인

  • 컨텍스트에서 코드를 실행하면 변수 객체에 "스코프 체인" 생성
  • 실행 컨텍스트가 접근할 수 있는 모든 변수와 함수에 순서를 정의하는 것
  • 스코프 체인의 앞쪽은 항상 코드가 실행되는 컨텍스트의 변수 객체
  • 다음 순서로는 해당 컨텍스트를 포함하는 부모 컨텍스트 (전역 컨텍스트에 도달할 때까지 진행)
  • "각 컨텍스트는 스코프 체인을 따라 상위 컨텍스트(밖)에서 변수나 함수를 검색할 수 있지만, 스코프 체인을 따라 내려가며 검색은 불가능하다"

스코프 체인 확장

  • 특정 문장의 경우 스코프 체인 앞쪽에 임시로 변수 객체를 만들고, 코드 실행이 끝나면 사라지게 하는 임시 객체 생성
    • try - catch문의 catch 블록
    • with 문

가비지 컬렉션

  • 자바 스크립트에서는 필요한 메모리를 자동으로 할당하고 더 이상 사용하지 않는 메모리는 자동으로 회수
  • 개발자가 직접 메모리 관리를 하지 않아도 됨
  • 주기적으로 실행
  • 코드 실행 중에 특정 시점에서 메모리를 회수하도록 지정할 수 있음

  • 더이상 사용하지 않는 변수를 식별하는 기준은 크게 2가지
    • 표시하고 지우기
      • 가장 널리 사용

      • 가비지 컬렉터가 작동하면 메모리에 저장된 변수 전체에 표시를 남김
      • 그 다음, 컨텍스트에 있는 변수와 컨텍스트에 있는 변수가 참조하는 변수에서 표시를 지움
      • 이후에 표시가 그대로 남아있는 변수는 컨텍스트에 있는 변수와 무관 -> 삭제해도 안전

    • 참조 카운팅
      • 각 값이 얼마나 많이 참조되었는지 추적
      • 참조 카운트가 0인 곳의 메모리를 회수
      • 순환 참조로 인한 문제점 발생

  • 가비지 컬렉터를 실행하는 것 역시 비용이므로 실행하는 타이밍이 중요하다

메모리 관리

  • 자바 스크립트라는 환경에서 메모리 관리와 가비지 컬렉션은 다른 환경과 매우 다르다
  • 최적화하는 좋은 방법으로 코드 실행에 필요한 데이터만 유지하는 것이다
  • 필요하지 않은 데이터는 null을 할당해 참조를 제거하는게 좋다 (주로 전역 변수, 전역 객체의 프로퍼티)