본문으로 건너뛰기
김신건의 로그

[Javascript] var / let / const

· 수정 · 📖 약 1분 · 238자/단어 #javascript #variable #scope #fundamentals
JS var, JS let, JS const, JS var / let / const, JavaScript 변수 선언

정의

JavaScript 의 3 가지 변수 선언 키워드.

키워드스코프재할당재선언호이스팅
varfunctionundefined 로 초기화
letblockTDZ
constblockTDZ

ES6 이후 let/const 가 표준. var 는 레거시 / 특수 케이스만.

var 의 문제

function foo() {
    if (true) {
        var x = 1;
    }
    console.log(x);   // 1 (블록 밖에서도 접근)
}

for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 0);
}
// 3, 3, 3 (var 가 함수 스코프라 클로저가 같은 i 공유)

let / const 의 해결

function foo() {
    if (true) {
        let x = 1;
    }
    console.log(x);   // ReferenceError (블록 스코프)
}

for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 0);
}
// 0, 1, 2 (let 이 매 반복마다 새 binding)

const 의 의미

const재할당 금지, 객체 내부 변경은 허용.

const arr = [1, 2, 3];
arr.push(4);              // ✓ 객체 내부는 변경 가능
arr = [];                  // ❌ TypeError (재할당 금지)

const obj = { a: 1 };
obj.a = 2;                 // ✓
obj = {};                  // ❌

객체를 진짜 불변으로 하려면 Object.freeze() 또는 immutable library.

호이스팅 차이

console.log(x);       // undefined (var 는 선언이 끌어올려짐)
var x = 1;

console.log(y);       // ReferenceError (TDZ)
let y = 1;

자세히는 JS 호이스팅, JS TDZ 참고.

모범 사례

  1. 기본은 const. 재할당 필요하면 let.
  2. var 는 사용 안 함. 레거시 코드 마이그레이션 외.
  3. 반복문은 let. 클로저 안전.
  4. 함수 상위에 한 번에 선언 안 함. 사용 직전에 선언.

자주 만나는 함정

1. for-loop 클로저

const funcs = [];
for (var i = 0; i < 3; i++) {
    funcs.push(() => i);
}
funcs.map(f => f());     // [3, 3, 3]

// let 사용
for (let i = 0; i < 3; i++) {
    funcs.push(() => i);
}
funcs.map(f => f());     // [0, 1, 2]

2. const 객체의 immutability 오해

const arr = [1];
arr.push(2);     // 동작함 → const 가 immutable 아닌가?
// const 는 binding 만 immutable, 내용은 mutable

3. var 의 전역 오염

// 브라우저 콘솔
var x = 1;
window.x;       // 1 (전역 객체에 attach)

let y = 1;
window.y;       // undefined

참고

이 글의 용어 (3개)
[Javascript] 스코프 체인javascript
정의 스코프 체인 (Scope Chain) 은 변수 식별자를 해결할 때 따라가는 중첩된 의 연결 구조. 안쪽 스코프에서 찾지 못한 변수를 바깥 스코프로 차례로 검색. 시각화 변수…
[Javascript] 호이스팅 (Hoisting)javascript
정의 호이스팅 (Hoisting) 은 JavaScript 엔진이 코드 실행 전에 선언을 스코프의 최상단으로 끌어올리는 동작. 단, / 는 로 접근 제한. var 의 호이스팅 엔진…
[Javascript] TDZ (Temporal Dead Zone)javascript
정의 TDZ (Temporal Dead Zone) 는 / / 선언이 호이스팅된 시점부터 선언문 (실행) 직전까지 의 접근 불가 구간. var 와의 비교 는 호이스팅 시 자동으로 …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기