log의 위치, 변수 키워드가 다른 것뿐인데 왜 결과가 다를까?
var a;
var b = 1;
const c = 2;
console.log(a);
console.log(b);
console.log(c);
>> undefined
1
2
console.log(a);
console.log(b);
console.log(c);
var a;
var b = 1;
const c = 2;
>> ReferenceError : Cannot access 'c' before initialization
undefined
undefined
3단계를 거쳐 생성되는 변수
1️⃣ 선언 단계 : 변수를 변수 객체에 등록
2️⃣ 초기화 단계 : 변수를 메모리에 할당하고, undefined로 초기화 (초기화되지 않았을 경우 접근 아예 불가!)
3️⃣ 할당 단계 : undefined로 초기화된 변수에 실제로 값 할당
여기서 키워드별로 다르게 동작합니다. (var, const, let)
| 구분 | var | let | const |
| 재선언 | 가능 (위험함) | 불가능 | 불가능 |
| 재할당 | 가능 | 가능 | 불가능 (상수) |
| 스코프 | 함수 레벨 스코프 | 블록 레벨 스코프 | 블록 레벨 스코프 |
| 호이스팅 | 선언+초기화(undefined) | 선언만 (TDZ 발생) | 선언만 (TDZ 발생) |
| 단점 | - 키워드 생략 가능 (할당, 재할당 모습 달라 혼란) - 중복 선언 가능 (처음 목적과 달리) - 변수 호이스팅 (실행순서와 무관) - 전역변수화 (무분별한 변수 접근) |
호이스팅
- var
: 코드 평가(코드 선언 + undefined 초기화) -> 코드 실행(값 할당 진행)
breaking point 따라

var은 이미 초기화가 되어있으므로 undefined

var이 할당되어 1

const 할당이 되어 2
c는 초기화까지만 진행되어 undefined로 마무리됩니다.
스코프 (Scope)
- 함수 레벨 스코프 (var)
: 함수 내부에서 선언된 변수만 지역 변수로 인정합니다. if문이나 for문 안에서 만든 변수도 밖에서 접근할 수 있어 의도치 않은 버그를 만듭니다.
- 블록 레벨 스코프 (let, const)
: 모든 코드 블록(함수, if문, for문, while문 등) 내에서 선언된 변수는 해당 블록 내에서만 유효합니다. 현대 프로그래밍 언어의 일반적인 방식입니다.
중복 선언과 재할당
- var: 똑같은 이름의 변수를 또 선언해도 에러가 나지 않습니다. 코드가 길어지면 실수로 기존 변수를 덮어쓸 위험이 큽니다.
- let: 중복 선언 시 에러가 발생하여 실수를 방지합니다. 값은 언제든 바꿀 수(재할당) 있습니다.
- const: 한 번 값을 넣으면 바꿀 수 없습니다. 선언과 동시에 초기화가 반드시 필요합니다.
🤔 💡실무에서는?
- 기본적으로 const를 사용 -> 값이 변하지 않는 것이 보장되면 코드를 읽기 쉽고 안전해집니다.
- 재할당이 필요한 경우에만 let을 사용 (예: 반복문의 카운터, 토글 상태값 등)
- var는 절대로 사용하지 말 것. -> 예측 불가능한 결과를 초래할 수 있습니다.
변수 네이밍 컨벤션
- Camel Case : getNumber
- Snake Case : get_number
- Pascal Case : GetNumber
- Constant Case : GET_NUMBER (상수에서만 사용)
'FE > Javascript' 카테고리의 다른 글
| [JavaScript] 자바스크립트의 데이터처리 : 함수 (0) | 2026.03.17 |
|---|---|
| [JavaScript] 자바스크립트의 자료형, 동적 타입 언어 (0) | 2026.03.17 |
| [JavaScript] javaScript의 기본 특징 (0) | 2026.03.09 |
| [JavaScript] 애니메이션, form, 조건문 (0) | 2025.06.30 |
| [Javascript] 이벤트리스너, JQuery함수 (2) | 2025.06.29 |