[JavaScript] var를 사용하지 않는 이유

김서진·2024년 1월 18일

나는 처음 자바스크립트를 배울 때부터 var를 배우지 않고 let과 const만 배우고 사용해 왔는데 var의 존재를 알고나서 찾아보니 사용하지 말라는 글이 굉장히 많이 보여서 구체적으로 어떤 이유 때문에 var를 사용하지 않는지 공부하면서 알게된 내용을 정리하게 되었다.


var에 대하여

ES6에서 let, const 키워드가 도입되기 전까지 var는 변수를 선언할 수 있는 유일한 키워드였는데 ES6에서 let과 const가 도입된 이유는 var 키워드의 여러 단점을 보완하기 위해서다.

var의 대표적인 단점들

1. 변수 중복 선언 허용

var a = 1;
var b = 1;

// 같은 스코프 내에서 중복 선언 허용

var x = 5;
var y; //초기화 문이 없는 변수 선언문은 무시된다.

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

위 예제에서 x와 y 변수는 중복 선언되었고 var로 변수를 중복 선언하면 초기화문 유무에 따라 다르게 동작한다.
만약 동일한 이름의 변수가 있는것을 모르고 중복 선언하면서 값을 할당하면 의도치 않게 먼저 선언된 변수의 값이 변경되는 부작용이 발생한다. 그리고 이때 에러는 발생하지 않는다.

2. 함수 레벨 스코프

스코프란 변수가 접근 할 수 있는 범위를 뜻 하는데 var 키워드는 함수 레벨 스코프로 var 키워드로 선언한 변수는 함수의 코드 블록만을 지역 스코프로 인정한다. 따라서 함수 외부에서 var 키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역 변수가 된다.

var a = 1;

if (true) {
	var a = 5; // 이미 선언된 전역 변수 a가 있으므로 a는 중복 선언된다.
}

console.log(a); // 5 

위의 예제처럼 함수 스코프는 전역 변수를 남발할 가능성을 높이고, 이로 인해 의도치 않게 전역 변수가 중복 선언되는 경우가 발생한다.

3. 변수 호이스팅

console.log(x); // undefined
var x = 5;
console.log(x); // 5

var 키워드로 선언한 변수는 선언문 이전에 참조할 수 있다. 단, 할당문 이전에 변수를 참조하면 언제나 undefinde를 반환한다.

console.log(y); // 참조에러
let y = 5;
console.log(y); // 5

그러나 let이나 const 키워드를 사용한 변수는 호이스팅이 발생하지만 초기화 단계에서 에러가 발생하므로 선언 이전에 참조할 수 없습니다.

이렇듯 변수 선언문 이전에 변수를 참조하는 것은 변수 호이스팅에 의해 에러를 발생시키지는 않지만 가독성을 떨어뜨리고 오류를 발생시킬 여지를 남긴다.

0개의 댓글