변수 : 변하는 값 (재할당을 해도 되는 것 : var, let)
상수 : 변하지 않는 값 (재할당이 안 되는 것 : const)
선언 → 초기화 → 할당
1. 선언 : 실행하는 context에 변수 객체를 등록한다. (스코프가 참조하는 대상이 되도록!)
💡스코프(Scope) 란?
변수에 접근할 수 있는 범위를 말한다.
- 전역 스코프(Global Scope) : 전역에 선언되어있어 어느 곳에서든지 해당 변수에 접근할 수 있다는 의미
- 지역 스코프(Local Scope) : 해당 지역에서만 접근할 수 있어 지역을 벗어난 곳에선 접근할 수 없다는 의미
초기화 : 변수 객체에 등록된 변수를 위해 메모리에 공간을 확보한다. (여기서 변수는 보통 undefined로 초기화된다.)
할당 : undefined로 초기화된 변수에 실제 값을 할당
var a = 1;
console.log(a);
// 1이 출력
var a = 2;
console.log(a);
// 2가 출력
// var는 선언을 아래에다 해도 동작한다.
// var name은 선언, name = "bom"은 할당
function person(){
name = "bom";
alert(name);
var name;
}
person();
// var name은 함수의 최상위로 호이스팅이 되기 때문에
// 실행될 일이 없는 구문 속에 있어도 선언이 된다.
// 자바스크립트가 동작하기 전에 코드를 한 번 훑는데(실행context)
// 그 때 var로 선언된 코드를 전부 최상위로 끌어올린다.
*** 따라서 var는 가급적 사용하지 않는 게 좋다.
{}
안에서 선언하면 {}
안에서만 쓰고 바깥에선 쓸 수 없다.// 재할당은 가능!
let name = 'bom';
name = '봄이';
// 재선언은 오류!
let name = 'bom';
let name = '봄이';
{}
안에서 선언하면 {}
안에서만 쓰고 바깥에선 쓸 수 없다.// 재할당 오류!
const name = 'bom';
name = '봄이';
// 재선언도 오류!
const name = 'bom';
const name = '봄이';
// 선언과 동시에 할당 되기 때문에 선언만 하고 값을 안줘도 오류가 난다.
const name;
TDZ(Temporal Dead Zone일시적인 사각지대)는 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 TDZ(Temporal Dead Zone) 라고 한다.
let과 const는 var와 달리 변수가 선언되기 전에 호출을 하면 ReferenceError
가 난다.
왜 에러가 날까? 호이스팅이 안 된 걸까?
정답은 호이스팅은 된다!
다만, 선언한 후, 초기화 단계에서 메모리에 공간을 확보하는데, 선언을 호이스팅해도 초기화 전까지 메모리에 공간이 확보되지 않아 변수를 참조할 수 없기 때문에 에러가 나는 것이다.
이것을 TDZ라고 한다.
→ 스코프에 진입할 때 변수를 만들고, TDZ가 생성되지만 코드 실행이(=실행 컨텍스트가) 변수가 있는 실제 위치에 도달할 때까지 엑세스를 못하기 때문이다.
변수명은 숫자로 시작할 수 없고, _와 $를 제외한 특수문자를 쓸 수 없다.