차이점
var
는 함수 범위를 가지며, 호이스팅의 특성 때문에 혼란을 줄 수 있다
중복선언과 재할당 모두 가능하다
let
과 const
는 블록 범위의 특징을 갖는다
특정 블록(if, for) 내에서 선언된 변수가 해당 블록 밖에서 접근 불가능하다는 것을 의미let
은 중복선언은 불가능하다 재할당은 가능하다
const
는 let과 var와 달리 한번 값을 할당하면 그 값을 변경할 수 없다
let과 const를 사용함으로써, 변수의 재할당과 재선언에 관련된 일반적인 문제점들을 피할 수 있는데 이로 인해 코드의 버그 발생 확률이 줄어들고, 코드의 안정성이 향상된다
현재 개발에서는 var의 한계와 문제점들을 피하기 위해 let과 const를 주로 사용하며,
변수의 재할당이 필요하지 않은 경우 const
,
필요한 경우에는 let
을 사용하는 것이 권장된다
var - 변수를 선언하는 옛날 방식
ES6(ES2015) 이전의 자바스크립트에서 변수를 선언하는 유일한 방법
- 함수 스코프 : var로 선언된 변수는 함수 스코프를 가짐
즉, 함수 내부에서만 유효하며, 블록({}) 내부에서 선언되어도 함수 전체에서 접근 가능
- 재선언 가능 : 같은 이름의 변수를 여러 번 선언할 수 있음
- 호이스팅 : var로 선언한 변수는 선언 전에 접근할 수 있음
변수 선언이 코드의 맨 위로 끌어 올려지는 것처럼 동작하지만, 초기화는 끌어올려지지 않음
따라서 선언 전에 접근하면 undefined가 나옴
예시
console.log(x); // undefined(호이스팅)
var x = 5;
if (true) {
var y = 10; // 함수 스코프
}
console.log(y); // 10 (블록 밖에서도 접근 가능)
문제점
변수의 중복 선언 가능
이미 선언했던 변수명을 모르고 또 사용할 경우, 기존에 있던 변수는 전혀 다른 값을 가지게 됨
그 경우, 그 변수를 사용하는 다양한 로직들에 치명적인 문제가 생김
for문에서의 문제점
var는 function-scoped이기 때문에, for문에서 순회를 위해 i라는 변수를 var로 선언한 경우, 이 변수는 for문이 종료되어도 접근이 가능하게 됨
만약 for문의 함수 내부가 아닌, 함수 외부에 전역적으로 돌아갈 경우 for문에서 사용한 var변수들은 전역 변수로서 역할을 하므로, 전역 변수가 남발될 수 있다
호이스팅
var키워드를 사용해 변수 선언 시, 해당 변수의 선언부를 최상단으로 올리는 것
JavaScript의 변수 생성과 초기화의 작업이 분리되어 진행되기 때문에 이런 현상 발생
var는 기존 c나 java의 Block-scoped가 아니라 Function-scoped
따라서 코드 전체의 최상단이 아닌 함수 내부의 최상단으로 이동함
( function-scoped는 중괄호로 구분된 영역의 범위를 갖는 것이 아닌 함수 내부의 영역을 범위로 갖는 것을 의미 )
let - 변수를 선언하는 현재 방식
ES6에서 도입된 변수 선언 방법, var의 단점을 해결하기 위해 만들어짐
- 블록 스코프 : let으로 선언된 변수는 블록 스코프를 가짐
즉, 변수가 선언된 블록({})내부에서만 유효
- 재선언 불가능 : 같은 스코프 내에서 같은 이름으로 변수를 다시 선언할 수 없음
- 호이스팅 : let 변수도 호이스팅이 일어나지만 TDZ(Temporal Dead Zone)라는 보호 구역이 있어 선언 전에 변수에 접근하려 하면 ReferenceError가 발생
예시
console.log(a); // ReferenceError (TDZ 때문에 선언 전 접근 불가)
let a = 5;
if (true) {
let b = 10; // 블록 스코프
console.log(b) // 10
}
console.log(y); // ReferenceError (블록 밖에서는 접근 불가)
const - 상수를 선언하는 방식
ES6에서 함께 도입된 상수 선언 방법, 변경되지 않는 값을 선언할 때 사용
그러나 객체나 배열과 같은 참조 자료형은 내부 상태가 변경될 수 있음
- 블록 스코프 : const도 let처럼 블록 스코프를 가짐
- 재선언 불가능 : let과 마찬가지로 같은 이름으로 변수를 다시 선언할 수 없음
- 재할당 불가능 : 한 번 값을 할당하면, 재할당이 불가능
다만, 참조 자료형(객체, 배열 등)은 내부 값을 변경할 수 있음
- 호이스팅 : const 역시 호이스팅이 발생하지만, 선언 전에 접근하려면 ReferenceError가 발생
var, let, const - 한눈에 알아보자
중복선언 | 재할당 | 스코프(Scope) | 호이스팅(Hoisting) | 전역객체 프로퍼티 | |
var | 가능 | 가능 | 함수레벨 스코프 | 호이스팅 시 undefined로 변수 초기화 (호이스팅 수행) |
할당 |
let | 불가능 | 가능 | 블록레벨 스코프 | 선언 단계-TDZ-초기화 단계-할당 단계로 분리되어 진행 호이스팅되지만 TDZ로 보호 |
undefined |
const | 불가능 | 불가능 | 블록레벨 스코프 | 초기화 이전 접근 시 ReferenceError 발생 호이스팅되지만 TDZ로 보호 |
undefined |
'FE > JavaScript' 카테고리의 다른 글
JS | for...in 과 for...of (0) | 2024.10.29 |
---|---|
JS | 원시 자료형(Primitive Type)과 참조 자료형(Reference Type) (0) | 2024.09.24 |
JavaScript란? (0) | 2024.09.24 |