var 는 ES5 까지 변수를 선언할 수 있는 유일한 방법이었다
var 는 다른 언어와는 구별되는 독특한 특징을 갖는다
var 의 단점을 보완하기 위해 나온 변수 선언 키워드
런타임 이전에 선언이 실행되고 변수 초기화는 일어나지 않는다
런타임 시 초기화는 변수 선언문에서 일어나고
할당문에서 값의 할당이 일어난다
런타임 이전 변수 선언 실행 (선언 단계) 후
스코프 시작 지점 부터 변수 선언문에서 초기화 까지의
변수를 참조할 수 없는 상태를 일시적 사각지대 (TDZ) 라고 부른다
let foo = 1;
{
console.log(foo); // Reference Error
let foo = 2;
}
호이스팅이 일어나지 않는다면 console.log() 에서 1이라는 결과를 주어야 하지만
블록 레벨 스코프를 갖는 let 키워드는 블록 내부에서 호이스팅이 일어난다
console.log() 의 위치가 아직 변수 선언문 이전이기 때문에 참조 에러가 발생하고
해당 위치까지는 TDZ
자바스크립트는 모든 선언에 대해 호이스팅 한다
하지만 ES6 문법인 let, const, class는 호이스팅이 일어나지 않는 것 처럼 동작한다
var 키워드로 전역에서 선언한 함수와 변수, 키워드 없이 선언한 변수 (암묵적 전역) 은
전역 객체의 프로퍼티가 된다
암묵적 전역과 var 는 사용하지 않는다
let 키워드로 선언한 변수는 전역 객체의 프로퍼티가 아니다
let 전역 변수는 렉시컬 환경의 선언적 환경 레코드 내에 존재하게 된다
const 는 상수를 뜻하고 상수로도 사용한다
하지만 변경이 일어나야만 하는 변수를 제외한 모든 변수는 const 로 선언한다
const 키워드는 상수라고 했지만
해당 키워드로 선언된 변수에 객체를 담는다면
객체 내부의 값을 변경할 수 있다
변수에서 참조하고 있는 값이 객체의 주소이기 때문이다
재할당을 금지할 뿐 불변성을 보장하는 것은 아니다
아마 기존의 모든 자바스크립트 코드를 한 번에 수정할 수 있다면
암묵적 전역 변수와 var 키워드로 선언된 변수는 사라질 것이다..
const 가 기본, let 은 정말 변수