var
로 선언한 변수는 let
이나 const
로 선언한 변수와 다른 두 가지 주요한 특성을 보입니다.
var
로 선언한 변수는 블록 스코프가 아닌 함수 수준 스코프를 갖습니다. ⇒ 즉, var는 블록 스코프가 없음var user = "Pete";
var user = "John"; // 이 "var"는 아무것도 하지 않습니다(이전에 이미 선언됨).
// ...에러 또한 발생하지 않습니다.
alert(user); // John
var
선언은 함수가 시작되는 시점(전역 공간에선 스크립트가 시작되는 시점)에서 처리됩니다.var
만의 특성은 대부분의 상황에서 좋지 않은 부작용을 만들어냅니다. let
이 표준에 도입된 이유가 바로 이런 부작용을 없애기 위해서입니다. 변수는 블록 레벨 스코프를 갖는 게 좋으므로 이제는 let
과 const
를 이용해 변수를 선언하는 게 대세가 되었습니다.
/* var는 블록 스코프가 없음 */
if (true) { //
var test1 = true; // 'let' 대신 'var'를 사용했습니다.
}
console.log(test1); // true(if 문이 끝났어도 변수에 여전히 접근할 수 있음)
if (true) {
let test2 = true; // 'let'으로 변수를 선언함
}
console.log(test2); // Error: test is not defined
// -----------------------------------------------------
function sayHi() {
var phrase; // 선언은 함수 시작 시 처리됩니다.
console.log(phrase); // undefined
phrase = "Hello"; // 할당은 실행 흐름이 해당 코드에 도달했을 때 처리됩니다.
}
sayHi();
이전에 변수 선언시 배웠던 종류[const, let, var]에서 가급적 var이 아닌 let을 사용하라는 글을 읽었다. 당시에도, var는 구식 변수 선언 형태여서 위험한 존재라고 배웠다.
하지만, 정확한 이유를 모르고 단지 위험하다는 말 하나 때문에 var이 아닌 let을 사용했었는데 오늘 드디어 그 이유를 알게 되었다.
실무에서 나는 JS 코드를 짤 때 var이 아닌 let 또는 const를 사용해서 변수 선언을 하고 있다. 하지만, 조금 거슬리는 것(?)은 의외로 실무에도 let이 아닌 var가 많이 사용되고 있다는 점이다.
내가 지금 참여하는 실무 프로젝트는 약 5년 전에 다른 회사에서 만든 것을 토대로 구현되고 있다. 따라서, 이 때 만들어진 것은 충분히 let이 아닌 var로 구현됐을 수 있다고 생각한다.
하지만, var의 위험성을 알게 된 이상, 앞으로는 기존에 존재했던 코드 중 var를 let으로 변환해서 안전한 시스템을 만들어야겠다라는 생각이 든다. (근데… var이 너무 많다 ;;; 이걸 다 언제 바꾸나 ㅎㅎ)