1. 변수란 무엇인가?
값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 가리키는 것.
2. 식별자
변수, 함수, 클래스 등 메모리 상에 존재하는 값을 식별할 수 있는 이름.
3. 변수 선언
- var : var 키워드를 사용한 변수 선언은 선언과 동시에 초기화 단계가 진행된다.
var car;
는 선언 단계에서 변수 이름 car를 등록하고 초기화 단계를 통해 undefined라는 값을 할당한다.
- let : let으로 선언한 변수는 런타임 이전에 선언 단계가 진행되지만 초기화 단계는 런타임 때 변수 선언문에 도달했을 때 실행된다. 이 차이로 인해 초기화 전에 액세스하거나 사용할 수 없는 let 변수에 대한 TDZ(temporal dead zone)가 발생
- const : const도 let과 마찬가지로 선언과 초기화 단계가 별도로 진행되고 TDZ가 존재한다.
- "그러나 const는 선언과 동시에 초기화(값 할당)되어야 한다"
이것은 코드에서 const 변수를 선언할 때 동일한 문 내에서 변수에 대한 초기 값도 제공해야 함을 의미한다. 즉 선언과 할당이 동시에 발생한다는 의미가 아니라 코드를 작성할 때 단일 문으로 결합된다는 뜻이다.
4. 호이스팅
JavaScript 엔진은 코드를 실제로 실행(런타임)하기 이전에 평가 단계에 변수 및 함수의 선언을 식별하고 처리한다. 이처럼 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트의 특징을 호이스팅이라고도 한다.
- 변수 선언 뿐 아니라 var, let, const, function, class 키워드를 사용하는 모든 선언은 호이스팅된다.
5. 값의 재할당
- var, let : 재할당이 가능. 선언과 동시에 undefined로 초기화되기 때문에 처음으로 값을 할당하는 것도 재할당이라고 볼 수 있다.
- const : 재할당이 불가능. 상수 값을 가진 변수.
- 변수의 값을 재할당하면 원래 있던 메모리 공간을 지우고 거기에 값을 재할당하는 것이 아니라, 새로운 메모리 공간을 만들어서 그곳으로 연결시켜준다. 이렇게 사용하지 않게 되는 메모리 공간은 가비지 컬렉터에 의해서 정리된다.
6. 스코프
- var : 함수 레벨 스코프
- let, const : 블록 레벨 스코프
📖 모던자바스크립트 딥다이브 4장 변수(34p), 15장 let,const키워드와 블록 레벨 스코프(208p)
[youtube]@시코 - 시니어코딩_변수, 상수, 데이터 타입, 호이스팅, 스코프 체인