웬만하면쓰지 않는 게 좋다! 구버전을 지원하기 위해서 어쩔 수 없을 수도 있겠지만..!
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
varname
: 변수명, 식별자
value
: 변수 초기값
- 데이터가 담길 메모리 공간 확보
- 확보한 메모리 공간의 주소를 담음
- 변수명(식별자)을 통해 해당 데이터에 접근할 수 있음
function x() {
y = 1;
var z = 2;
}
x();
console.log(y); // 1
console.log(z); // ReferenceError: z is not defined
console.log(a); // ReferenceError: a is not defined
console.log("still going..."); // 실행되지 않음
var a;
console.log(a); // undefined
console.log("still going..."); // 실행됨
var a = 1;
b = 2;
delete this.a; // 실패 -> 선언된 변수는 non-configurable
delete this.b; // 성공 -> b는 실행 컨텍스트(객체) 속성에서 제거됨
console.log(a, b); // ReferenceError: b is not defined
- 같은 스코프 내에서도 중복 선언 허용
var x = 1;
var y = 1;
var x = 100;
var y; // 초기화문이 없는 변수 선언문은 무시
console.log(x); // 100
console.log(y); // 1
- 오직 함수의 블록만을 로컬 스코프로 인정
- 함수 내부가 아닌 if문, for문 등의 블록 내에서 선언하면 전역 변수
var x = 1; // 전역 변수
// if문 블럭
if (true) {
var x = 100; // 전역 변수
}
console.log(x); // 100
- 마치 변수 선언문이 코드의 맨 윗단으로 끌어 올려진 것처럼 동작하는 현상
- 코드가 실행되기 전, 자바스크립트 엔진은 이미 실행 환경의 변수명을 알고 있음(평가 과정)
- var는 평가 과정에서, 선언 단계와 초기화 단계(undefined로 초기화)가 동시에 이뤄짐
console.log(x); // undefined
x = 100;
console.log(x); // 100
var x; // 호이스팅 발생
console.log(x); // 100
/* 개발자 A가 작성한 코드 */
var answer = "이 문장은 바뀌면 안 됩니다.";
/* ... 수만 줄의 코드 ... */
/* 개발자 B가 작성한 코드 */
var answer = 1;
console.log(answer); // 1
/* 실행 순서대로 재배치 */
var x;
console.log(x); // undefined
x = 100;
console.log(x); // 100
console.log(x); // 100
/* 여러 변수 선언 및 초기화 */
var x, y;
var a = 0,
b = 0;
/* 단일 값으로 여러 변수 할당 */
var a = "A";
var b = a;
// 또는
var a,
b = (a = "A");
// 순서 주의
var x = y,
y = "A"; // x: undefined, y: "A"
『코어 자바스크립트』 정재남 지음
『모던 자바스크립트 Deep Dive』 이웅모 지음
- let
- const
- scope
- execution context