- 변수(Variable)는 프로그램에서 사용되는 데이터를 일정 기간동안 기억하여 필요한 때에 다시 사용하기 위해 데이터에 고유의 이름인 식별자(identifier)를 명시한 것이다.
- 변수에 명시한 고유한 식별자를 변수명이라 하고 변수로 참조할 수 있는 데이터를 변수값이라 한다.
- 삭별자는 어떤 대상을 유일하게 식별할 수 있는 이름을 말한다. 식별자에는 변수명, 함수명, 프로퍼티명, 클래스명 등이 있다.
- 변수는 var, let, const 키워드를 사용하여 선언하고 할당 연산자를 사용해 값을 할당한다.
그리고 식별자인 변수명을 사용해 변수에 저장된 값을 참조한다.

변수명은 식별자로 불리기도 하며 명명 규칙이 존재한다.
- 반드시 영문자(특수문자 제외), underscore(_), 또는 달러 기호($)로 시작하여야 한다. 이어지는 문자에는 숫자(0~9)도 사용할 수 있다.
- 자바스크립트는 대/소문자를 구별하므로 사용할 수 있는 문자는 "A"~"Z" (대문자)와 "a"~"z"(소문자)이다.
- 값을 할당하지 않은 변수 즉 선언만 되어있는 변수는 undefined로 초기값을 갖는다.
변수 호이스팅(Variable Hoisting)

1 에서 변수 foo는 아직 선언되지 않았으므로 ReferenceError:foo is not defined가 발생할 것을 기대했겠지만 콘솔에는 undefined가 출력된다.
이것은 다른 C-family 언어와는 차별되는 자바스크립트의 특징으로 모든 선언문은 호이스팅되기 때문이다.
호이스팅이란 var선언문이나 function선언문 등 모든 선언문이 해당 Scope의 선두로 옮겨진 것처럼 동작하는 특성을 말한다. 즉, 자바스크립트는 모든 선언문 (var,let,const,function,function*,class)이 선언되기 이전에 참조 가능하다.
변수가 어떻게 생성되며 호이스팅은 어떻게 이루어지는지 좀더 자세히 살펴보자. 변수는 3단계에 걸쳐 생성된다.

var키워드로 선언된 변수는 선언 단계와 초기화 단게가 한번에 이루어진다. 즉, 스코프에 변수가 등록되고 변수는 메모리에 공간을 확보한 후 undefined로 초기화된다. 따라서 변수 선언문 이전에 변수에 접근하여도 Variable Object에 변수가 존재하기 때문에 에러가 발생하지 않는다. 다만 undefined를 반환한다. 이러한 현상을 변수 호이스팅이라 한다.

1이 실행되기 이전에 var foo = 123;이 호이스팅되어 1 구문 앞에 var foo;가 옮겨진다. (실제로 변수 선언이 코드 레벨로 옮겨진 것은 아니고 변수 객체에 등록되고 undefined로 초기화된 것이다.) 하지만 변수 선언 단계와 초기화 단계가 할당 단계와 분리되어 진행되기 때문에 이 단계에서는 foo에는 undefined가 할당되어 있다. 변수 foo에 값이 할당되는 것은 2행에서 실시된다.
2에서는 변수에 값이 할당되었기 때문에 123이 출력된다.
자바스크립트의 변수는 다른 C-family와는 달리 블록 레벨 스코프를 가지지 않고 함수 레벨 스코프를 갖는다.

따라서 코드 블록 내의 변수 foo는 전연벽수이므로 전역에 선언된 변수 foo에 할당된 값을 재할당하기 때문에
3의 결과는 456이 된다.
'JavaScript' 카테고리의 다른 글
| [PoiemaWeb] 단축 평가 (0) | 2023.03.08 |
|---|---|
| [PoiemaWeb] break, continue (0) | 2023.03.08 |
| [PoiemaWeb] 연산자 (0) | 2023.03.08 |
| [PoiemaWeb] 데이터 타입 (0) | 2023.03.07 |
| [PoiemaWeb] 기본 문법 (0) | 2023.03.07 |