자바스크립트에서 변수 선언을 하는 var, const, let
var
var name = '짱구'
console.log(name) // 짱구
var name = '철수'
console.log(name) // 철수
같은 변수명으로 중복 선언했음에도 불구하고 정상적으로 출력 -> 코드 분량이 많아질 경우 오류 발생 가능
let
let a = '짱구';
let a = '철수';
// SyntaxError: Identifier 'a' has already been declared.
let a = '짱구';
a = '철수' ;
const
const text = 'hello';
// text = 'hi' (불가능)
//1.상수
const MAX_FRUITS = 5;
// 2.재할당 불가능한 상수변수
// 또는 변수 but 변수가 가리키고 있는 오브젝트의 변경은 가능하다.
const apple = {
name: 'apple',
color: 'red',
display: '🍎',
};
// apple = {};
console.log(apple);
apple.name = 'orange';
apple.display = '🍏';
함수 스코프
를 갖는다.블록 스코프
를 갖는다.따라서, 위 코드를 실행했을 때 블록 안에 있는 baz
를 출력하게 되면 ReferenceError가 발생
undefined
로 초기화 된다.var의 경우 위와 같이 선언 전에 출력하면 undefined 가 출력된다.
let의 경우는 선언 전에 호이스팅 되긴 하지만 어떤 값도 가지지 않기 때문에 ReferenceError가 발생한다. 이런 현상을 TDZ(Temporal Dead Zone)
라고 한다.
즉, 선언은 되었지만 참조는 할 수 없는 사각지대를 갖는 것이다.
strict mode가 아니라는 가정 하에,
브라우저 환경에서 글로벌 객체는 window
인데, var의 경우 바인딩이 되었고 let의 경우는 되지 않았다는 걸 볼 수 있다.