var
키워드로 선언한 변수의 문제점var
키워드로 선언한 변수는 중복 선언이 가능하다.
var
키워드로 선언한 변수는 오로직 함수의 코드 블록만을 지역 스코프로 인정한다.
따라서, 함수 외부에서 선언된 변수는 모두 전역 변수가 된다.
var
키워드로 변수를 선언하면 [[4장 변수#호이스팅|변수 호이스팅]]에 의해 변수 선언문이 스코프의 선두로 끌어 올려진 것처럼 동작한다.
let
키워드기존의 var
키워드의 단점을 보완하기 위해 ES6에서 const
와 함께 도입되었다.
let
키워드로 이름이 같은 변수를 중복 선언하면 SyntaxError가 발생한다.
함수, if 문, for 문, while 문, try/catch 문 등 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.
변수 호이스팅이 발생하지 않는 것처럼 동작한다.
발생하지 않는다가 아닌, "발생하지 않는 것"처럼 동작하는 것이다. 왜일까?
let
키워드로 선언한 변수는 "선언 단계"와 "초기화 단계"가 분리되어 진행된다.
let
키워드로 선언한 변수는 스코프의 시작 지점부터 초기화 단꼐 시작 지점(변수 선언문)까지 변수를 참조할 수 없다. 스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간을 일시적 사각지대 TDZ라 부른다.
즉, 실제로는 호이스팅이 발생하는 것이다.
let foo = 1; // 전역 변수
{
console.log(foo);
let foo = 2; // 지역 변수
}
위 예제에서 호이스팅이 발생하지 않는 다면 foo의 값을 출력할 때, 전역 변수의 값 1
을 출력해야 한다.
하지만, 호이스팅은 여전히 발생하기 때문에, ReferenceError 가 발생한다.
자바스크립트는 ES6에서 도입된
let
,const
를 포함해 모든 선언을 호이스팅한다.
단,let
,const
,class
를 사용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작한다.
let
var
키워드로 선언한 전역 변수와 전역 함수, 그리고 선언하지 않은 변수에 값을 할당한 암묵적 전역은 전역 객체 window
의 프로퍼티가 된다.
암묵적 전역은 21장에서 다룬다.
하지만, let
키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다.
const
키워드let
키워드와 대부분 동일하다.
const
키워드로 선언한 변수는 반드시 선언과 동시에 초기화 해야 한다.
const
키워드로 선언한 변수는 재할당이 금지된다.
상수는 재할당이 금지된 변수를 말한다.
일반적으로 상수의 이름을 대문자로 선언한다.
여러 단어로 나뉘는 경우 언더스코어(_
)로 구분해서 스네이크 케이스로 표현한다.
const
키워드와 객체const
키워드로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있다.
즉, 재할당을 금지할 뿐, "불변"을 의미하지는 않는다.