15.1 var 키워드로 선언한 변수의 문제점

<aside> 💡

ES5까지 변수를 선언할 수 있는 방법은 var 키워드 뿐이였다.

var 키워드로 선언된 변수의 특징으로

  1. 변수 중복 선언이 가능하다.
  2. 함수의 코드 블록만을 지역 스코프로 인정한다.
  3. 변수 호이스팅에 의해 변수 선언문이 스코프의 선두로 끌어 올려진 것처럼 동작한다 </aside>

15.1.1 변수 중복 선언 허용

[ 예제 15 - 01 ]

var x = 1;
var y = 1;

// var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용한다.
// 초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다.
var x  = 100;
// 초기화문이 없는 변수 선언문은 무시된다.
var y;

console.log(x); // 100
console.log(y); // 1

<aside> 💡

위 코드에서 보면 알 수 있듯이

var의 문제점이 존재한다. 혹여나 자신의 실수로 이미 var로 선언된 변수 명을 한번 더 사용하게 되면 의도치 않게 먼저 선언된 변수 값이 변경되는 부작용이 발생한다.

</aside>

15.1.2 함수 레벨 스코프

[ 예제 15 - 02 ]

var x = 1;

if(true) {
// x는 전역 변수다. 이미 선언된 전역 변수 x가 있으므로 x 변수는 중복 선언된다.
// 이는 의도치 않게 변수값이 변경되는 부작용을 발생시킨다.
var x = 10;
}

console.log(x); // 10

[ 예제 15 - 03 ]

var i = 10;
// 여기서 다른 작업을 위해 i에 10을 대입하여 작업했다고 가정

// 여기서 까먹어 버리고 반복문을 사용할 때 주로 사용하는 i를 다시 선언해버림 !!
// for문에서 선언한 i는 전역 변수다. 이미 선언된 전역 변수 i가 있으므로 중복 선언된다.
for(var i = 0; i < 5; i++){
	console.log(i); // 0 1 2 3 4
	}
	
// 의도치 않게 i 변수의 값이 변경되었다.
console.log(i); // 5가 출력된다.

15.1.3 변수 호이스팅

[ 예제 15 - 04 ]

// 이 시점에는 변수 호이스팅에 의해 이미 foo 변수가 선언되었다. (1. 선언 단계)
// 변수 foo는 undefined로 초기화된다. (2. 초기화 단계)
console.log(foo); // undefined

// 변수에 값을 할당 (3. 할당 단계)
foo = 123;

console.log(foo); // 123

// 변수 선언은 런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 실행된다. 
var foo;

<aside> 💡

자바 스크립트에서는

  1. var foo; 선언을 스코프의 최상단으로 끌어올린다. ( 변수를 선언만 함!! 변수에 값 할당 XX )
  2. var foo을 통해 변수명 선언만 하였기 때문에 값이 할당되어있지 않아서 console.log(foo); 을 실행하였을 때 undefined 값이 출력된 것
  3. 다음 줄에 foo = 123; 을 통해 선언된 foo에 123값을 할당
  4. console.log(foo); 의 출력 값은 123이 출력 된다.

즉, var로 선언된 변수는 선언은 호이스팅되어 스코프의 최상단에 선언되지만, 값이 할당되지 않으면 undefined의 값을 가짐

</aside>