var
- local variable / global variable을 구분하기 위해서 사용
- 글로벌 오브젝트에서 작성하면 글로벌 스코프에 들어가서 글로벌 변수가 되는 것
- 스코프에 대한 이슈가 발생 (ex: 아무나 우리집에 들어오는 듯한 느낌)
- ES5에서
use strict
로 해당 문제에 대해 접근하였으나 근본적인 해결책이 되지 않았음.
let
- 블록단위 스코프(함수 안에서 작성한 let 변수는 함수가 스코프)
- 블록단위이기 때문에 각기 다른 블록에 동일한 변수명으로 각각 값을 설정할 수 있으며 변수 값이 유지됨
- let 변수는
hoisting
이 되지 않는 것은 아니지만, 변수가 실제 위치한 곳에 도달하기 전까지 액세스할 수 없다.
Temporal Dead Zone(TDZ)
function varTest() {
var x = 1;
if (true) {
var x = 2; // 상위 블록과 같은 변수!
console.log(x); // 2
}
console.log(x); // 2
}
function letTest() {
let x = 1;
if (true) {
let x = 2; // 상위 블록과 다른 변수
console.log(x); // 2
}
console.log(x); // 1
}
// let 변수는 다른 스코프에 대해 다른 값이 유지되는 것을 보여준다.
const
- 상수 값 (변하지 않는 값을 선언) - 재할당, 재선언 불가
let
과 마찬가지로 블록단위 스코프
let
변수와 마찬가지로 TDZ
, hoisting
에 대한 고려가 필요하다.
// NOTE: 상수 값은 소문자나 대문자 모두 사용가능하지만, 일반적으로 대문자로 작성하는 것이 보통이다.
const MY_FAV = 7;
// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;
// MY_FAV is 7
console.log('my favorite number is: ' + MY_FAV);