| 키워드 | 재선언 | 중복선언 | 재할당 |
var O O O
let X X O
const X X X
---------------------------------------------------
var a; // 변수 선언
console.log(a); // 변수 값 출력 (undefined : 값을 할당하지 않았음.)
a = 2; // 변수 할당
console.log(a); // 변수 값 출력 (2)
var a2 = 4; // 변수 선언 & 할당 = 초기화
console.log(a2); // 4
var a2 = 5; // 재선언 가능
console.log(a2); // 5
a2 = 30; // 재할당 가능
console.log(a2); // 30
let b; // 변수 선언
console.log(b); // undefined : 변수 선언만 하고 값을 할당하지 않았으므로 초기값 (undefined) 출력.
b = 7; // 변수 할당
console.log(b); // 7
let b2 = 77; // 변수 선언 & 할당 = 초기화
console.log(b2);
// let b2 = 78; // error: let 키워드 재선언 & 중복 선언 불가능
b2 = 78; // 재할당 가능
console.log(b2); // 78
-> 변수 선언과 할당이 동시에!!! (반드시)
-> 변하지 않는 값을 변수에 저장할 때 사용 (상수)
ex) const c; // error: const 키워드는 선언, 할당이 반드시 동시에!
const c = 3;
console.log(c); // 3
// const c = 4; // 재선언 불가능!
// c = 33; // error: const 변수는 재할당이 불가능!
// 재선언 & 중복선언 => 엇비슷 해보이지만, "스코프"의 개념을 고려하면 차이가 명확함
// ** 재선언?
// : "같은 스코프" 내에서 동일한 변수 이름을 다시 선언하는 경우.
// Ex1) var
var y = 10;
var y = 20;
console.log(y); // 20 출력
// Ex2) let
let z = 40;
// let z = 60; // 재선언 불가
console.log(z); // 40 출력
// ** 중복선언?
// : "다른 스코프" 에서도 동일한 변수 이름을 다시 선언하는 경우.
// Ex1) var
if (true) {
var s = 10; // 함수 스코프
}
if (true) {
var s = 50; // 함수 스코프 (var는 블록 스코프를 따르지 않고, 함수 스코프를 따름)
}
console.log(s); // 50 (블록 밖에서도 접근 가능) ==> 예상치 못한 결과를 초래할 가능성!
=> chap.4
// Ex2) let
if (true) {
let e = 10;
}
if (true) {
let e = 50;
}
// console.log(e); // ReferenceError: e is not defined 다른 블록 스코프에서 호출했기 때문에
// ** 스코프?
// : 스코프는 "범위" 라고 생각하면 된다.
// 1. 전역 스코프
// 2. 지역 스코프(= 함수 스코프)
// 3. 블록 스코프( {} 감싸진 내부 )
console.log(x); // undefined
var x = 10;
console.log(x); // 10
실제 JS 엔진은 이렇게 해석
var x; // 변수 선언 (호이스팅)
console.log(x); // undefined
var x = 10;
console.log(x); // 10