[노란책] 변수, 스코프, 메모리
04. 변수, 스코프, 메모리
Primitive Type과 Reference Type
Primitive Type 변수
- 변수에 값을 저장
- String, Number, Boolean, Undefined, Null
- typeof로 타입을 알아낼 수 있음
Reference Type 변수
- 변수에 객체의 주소값(Reference)을 저장
- Object
- instanceof로 타입을 알아낼 수 있음(프로토타입 비교)
함수 파라미터 전달 시 Argument에 복사되는 값
- 변수가 가진 값 자체가 값 복사됨
실행 컨텍스트와 스코프
실행 컨텍스트
- 코드 실행에 필요한 정보를 포함하고 있는 객체: 변수객체, 스코프체인, This
- 변수 객체(선언 시 결정): 실행 컨텍스트 내부에서 생성된 변수 - 선언된 변수, 함수, 함수인 경우, 해당 함수 실행 시 전달된 arguments 등
- 스코프체인(선언 시 결정): 실행 컨텍스트에서 접근가능한 변수의 범위
- This(호출 시점에 결정): 함수 실행 방식에 따라 달라짐
- 전역 컨텍스트를 제외하고는 함수가 실행될 때 생성됨
- 스택으로 관리되어 함수 실행 시 생성되고, 함수 종료 시 삭제됨
스코프
- 실행 컨텍스트 내의 변수가 존재하는 영역(경계)
- 스코프체인 순서대로 변수를 검색하며, 변수를 찾으면 검색을 종료
- ES5에서는 함수 단위의 스코프만 지원(블록레벨 스코프는 지원하지 않음) - 초보자들이 주로 실수하는 부분
가비지 콜렉션
Mark and Swipe
- 외부에서 접근할 수 없는 변수를 지우는 방식
- 모던 브라우저에서 채택
Reference Counting
- 변수를 참조하고 있는 수가 0이면 지우는 방식
- 순환참조 시, 사용이 끝났음에도 가비지콜렉팅되지 않는 버그가 있어, 모던 브라우저에서 사용되지 않음
- 하지만, IE8의 DOM 객체에서 변수를 관리하는 방식이라 주의가 필요 - 변수 사용이 완료되면 Null을 할당하는 코딩 습관으로 순환참조 버그를 방지할 수 있음