:메모리 공간에 저장된 값을 재사용 할 수 있도록, 메모리 공간에 이름을 붙인것
식별자 이름은 데이터를 쉽게 식별할 수 있기위해 서술적이어야 함.
camelCase방식
: 각 단어의 앞글자는 대문자로 함 ex) topMenuBtn , numCount
var a; // 1.변수 선언
a = undefined; // 2.값 할당(초기화) ←암묵적으로 이뤄짐
----------- 런타임 이후에 -------------
a = 10; // 3.할당
a = 20; // 4.재할당
단계1 - 변수 선언
: 변수를 생성하는 것.
: 변수 이름을 등록하고 값을 저장하기 위한 메모리 공간을 확보하는 것.
단계2 - 초기화
: 변수가 선언된 이후 최초로 값을 할당하는 것.
: var로 선언한 변수는 undefined로 암묵적인 초기화가 자동으로 수행됨.
---------------------------- 런타임 이후에 ----------------------------
단계3 - 할당
: 변수 할당문에 도달하면 비로소 값이 할당됨.
단계4 - 재할당
: 재할당을 하면 이전 메모리 공간을 지우고 새로운 메모리 공간을 확보하고 그 메모리 공간에 값을 새로 저장하게 됨.
이전 메모리 공간은 가비지 콜렉터에 의해 메모리에서 자동으로 해제됨.
(가비지 콜렉터: 메모리 공간을 주기적으로 검사하여 더 이상 사용하지 않는 메모리를 해제하는 기능)
: 런타임 이전에 변수 선언 단계만 먼저 진행되고, 초기화 단계는 변수 선언문에 도달해야 실행됨
let a; // 1.변수 선언
----------- 런타임 이후에 -------------
a = 10; // 2.값 할당(초기화)
a = 20; // 3.재할당
const x = 1;
: var키워드로 선언한 변수는 런타임 이전에 암묵적으로 "변수 선언"과 "초기화"가 한번에 진행된다.
때문에 런타임시 변수 선언문 이전에 변수를 참조할 수 있는 것임
console.log(score); // 2.런타임시 undefined 출력가능(호이스팅 가능)
var socore; // 1.런타임 이전에 "변수 선언"과 "초기화"가 이뤄짐(var는 선언과 동시에 undifined로 초기화됨.)
socore = 80; // 3.런타임시 - "값 80이 할당"됨.
console.log(score); // 4.80출력
console.log(foo);
// 2.런타임시 이전에 변수가 들어갈 공간이 준비되어 있기 때문에 호이스팅 발생함.
// 그러나 tdz 때문에 참조에러 발생하는 것임
let foo; // 1.런타임 이전에 변수 선언만 함
console.log(foo); // 3. undefined - 런타임시 변수 선언문에서 초기화가 실행됨.
foo = 1; // 4. 값 할당
console.log(foo); // 1 5.값이 참조됨.
console.log(foo); // ReferrenceError // 2.호이스팅 됨. 하지만 참조에러 발생
const foo = 1; // 1.런타임 이전에 변수 선언만 됨 // 3.초기화 됨
console.log(foo); // 4.값 참조 가능
< hoisting 요약정리 >
1. var, let, const는 모두 호이스팅이 가능하다.
2. 그러나 let, const는 호이스팅이 안되는 것 처럼 보인다.
(사실 호이스팅이 가능하다. 때문에 "참조"에러가 나는 것임)
3. 그 이유는
let, const의 변수 선언은 런타임 이전에 되지만, 초기화는 런타임시 되는데,
TDZ라는 "스코프 시작~초기화" 단계 동안은 변수를 참조할 수 없는 구간이 있기 때문이다.