ECMAScript 공식 명세는 변수의 선언(declaration)과 초기화(initialization)에 대해 다음과 같이 설명하고 있습니다.
ECMAScript 명세의 원문 해설
“var 문은 현재 실행 중인 실행 컨텍스트(Execution Context)의 VariableEnvironment에 스코프가 지정되는 변수들을 선언합니다. var 변수는 자신을 감싸고 있는 렉시컬 환경(Lexical Environment)이 인스턴스화되는 시점에 생성되며, 생성되는 순간 undefined로 초기화됩니다. […] Initializer가 포함된 VariableDeclaration으로 정의된 변수는 VariableDeclaration이 실제로 실행될 때, 즉 변수가 생성되는 시점이 아니라 Initializer의 AssignmentExpression 값을 할당받습니다.”
핵심 차이점 정리
위 명세 내용을 바탕으로 선언과 초기화의 차이를 정리하면 다음과 같습니다.
- 모든 변수는 기본적으로
undefined값으로 초기화됩니다. - 변수 선언은 렉시컬 환경이 초기화되는 시점에
undefined값으로 설정됩니다. - 이러한 초기화 과정은 실제 값 할당(assignment)으로 동작하지 않습니다.
예제 코드로 이해하기
var num; // 선언: 변수가 생성되고 undefined로 초기화됨
console.log(num); // 출력: undefined
num = 10; // 초기화(할당): 코드 실행 시점에 값이 대입됨
console.log(num); // 출력: 10마무리 정리
결국 선언은 변수를 메모리에 등록하면서 undefined로 초기화하는 단계이고, 초기화(값 할당)는 코드가 실제로 실행되는 시점에 Initializer 표현식의 결과값을 변수에 대입하는 단계입니다. 즉, 변수가 만들어지는 시점과 값이 채워지는 시점이 서로 다르다는 것이 두 개념의 핵심적인 차이입니다.