*자바스크립트에서 스코프는 중요한 개념이므로 꼭 기억해야 함!
렉시컬 환경이란?
- 렉시컬 환경은 스코프를 구분하여 식별자를 등록하고 관리하는 저장소 역할을 하는 렉시컬 스코프의 실체임
- 환경 레코드(Enviornment Record)와 외부 렉시컬 환경(상위 스코프)에 대한 참조로 이루어짐
- 자바스크립트 엔진에 내장된 자료구조
- environment record(환경 레코드)와 outer environment reference(상위 환경에 대한 참조)라는 프로퍼티를 가지는 형태로 구현됨
스코프란?
- 선언한 변수의 적용 범위를 가르킴
- 종류로는 함수 레벨 스코프, 블록 레벨 스코프가 있음
- 하위 위치 내에선 상위 위치의 변수 등을 사용할 수 있지만, 상위 위치에서 하위 위치의 변수 등을 사용할 수 없으며, 형제 위치에서도 사용할수 없음
정적 스코프 vs 동적 스코프
- 정적 스코프 (렉시컬 스코프)
- 호출 스택과 관계없이 선언 시점에 상위 스코프를 결정
- 자바스크립트는 정적 스코프의 특징을 가짐
- 동적 스코프
- 동적 스코프의 선언은 런타임 도중에 실행 콘텍스트나 호출 콘텍스트에 의해 결정
- 함수를 어디서 호출했느냐에 따라 상위 스코프 결정!
함수(지역) 레벨 스코프
- var 예약어로 선언한 변수는 함수 레벨 스코프를 가짐
- 함수 내에서 변수를 선언했다면, 선언한 함수 내에서만 해당 변수를 사용할 수 있음 → 지역 스코프를 가짐
- 함수 안에서 var 예약어를 빼먹고 변수를 선언하면, 전역변수로 인식이 됨
- 프로그램 시작 부분에서 변수 선언 시 프로그램 전체에서 사용할 수 있음 → 전역 스코프를 가짐
var 변수와 호이스팅
- 호이스팅
- 자바스크립트 해석기가 함수 소스를 훑어보면서 변수를 따로 기억해 두기 때문에, 소스 상에서는 나중에 선언하더라도 내부적으로는 먼저 선언한 것 처럼 인식
- 변수 호이스팅은 오류 없이 예상 못한 결과를 만드므로, var 변수를 쓸땐 호이스팅에 주의하기!

- 참고로, let을 쓰면 그냥 오류 남

블록 레벨 스코프
- let, const 예약어로 선언한 변수는 블록 레벨 스코프를 가짐
- 자바스크립트에서의 블록은 중괄호{}로 둘러싸인 영역을 가리킴(함수, 조건문, 반복문)
- 블록 레벨 스코프 : 블록별로 변수의 유효범위가 결정되는 것
- let이나 const를 사용해 만든 변수는 변수가 선언된 블록 안에서만 유효함(블록 변수)

바람직한 자바스크립트 변수 사용법
var 변수 보다는 let, const 변수를 사용하는 것이 좋음
- 여러 사람이 함께 진행하는 프로젝트인 경우, 재선언 할 수 없고 호이스팅도 없는 let, const 변수 사용하는게 안전함!
전역변수는 최소한으로 사용하자
- 가능하면 전역변수의 사용을 줄이고, 프로그램에서 값이 변하지 않는다면 const로 선언
객체 선언의 경우 const를 사용하자
- 객체 선언 시 프로그램 중 객체 (주소) 자체가 바뀌지 않도록 const를 사용해서 선언
- 객체를 const로 선언해도 객체 안에 있는 프로퍼티는 얼마든지 수정할 수 있음
* 가비지 컬렉션
- 자바스크립트는 도달 가능성(reachability) 이라는 개념을 사용해 메모리 관리를 수행함
- ‘도달 가능한(reachable)’ 값은 쉽게 말해 어떻게든 접근하거나 사용할 수 있는 값을 의미함
- 도달 가능한 값은 메모리에서 삭제되지 않음
1. 아래의 값들은 그 태생부터 도달 가능하기 때문에, 명백한 이유 없이는 삭제되지 않음
(이런 값을 루트라고 부름)
- 현재 함수의 지역 변수와 매개변수
- 중첩 함수의 체인에 있는 함수에서 사용되는 변수와 매개변수
- 전역 변수
- 기타 등등
2. 루트가 참조하는 값이나 체이닝으로 루트에서 참조할 수 있는 값은 도달 가능한 값이 됨
- 전역 변수에 객체가 저장되어있다고 가정해 보았을 때, 해당 객체의 프로퍼티가 또 다른 객체를 참조하고 있다면, 프로퍼티가 참조하는 객체는 도달 가능한 값이 됨
- 이 객체가 참조하는 다른 모든 것들도 도달 가능하다고 여겨짐
- 자바스크립트 엔진 내에선 가비지 컬렉터(garbage collector)가 끊임없이 동작함
- 가비지 컬렉터는 모든 객체를 모니터링하고, 도달할 수 없는 객체는 삭제함
(참고 포스팅 : 가비지 컬렉션)
참고 포스팅 : 렉시컬 환경 (Lexical Environment) / 스코프(scope) 용어정리
'언어 > 자바스크립트(Java Script)' 카테고리의 다른 글
| [자바스크립트] Event (0) | 2024.07.31 |
|---|---|
| [자바스크립트] DOM(문서 객체 모델) (0) | 2024.07.30 |
| [자바스크립트] 변수 / 자료형 / 형변환 (0) | 2024.07.30 |
| [자바스크립트] 개발 환경 세팅 (0) | 2024.07.30 |
| [자바스크립트] 기본 사항 (0) | 2024.07.30 |
댓글