자바스크립트
ES5
버전 까지의 변수 선언 방식이었다.
a = 10; // a는 var 변수이다.
console.log(a); // 10
var a = "10";
console.log(a); //10
var a = "20"; // 재선언
console.log(a); //20
a = "30"; // 재할당
console.log(a); //30
자바스크립트는 기본적으로 함수 레벨 스코프를 가진다.
함수 레벨 스코프란 함수 안에서 사용하면 함수 밖을 제외한 내부 어디서든 접근 가능하고, 함수 외부에서 선언된 모든 변수는 전역 변수로 한다는 의미이다.
(c
와 java
같은 다른 언어는 블록 레벨 스코프를 가진다.)
function f() {
var hello = "hello world";
console.log(hello);
}
f(); // hello world
console.log(hello); // ReferenceError
함수 외부에서hello
변수에 접근한다면 참조에러가 발생한다.
전역 변수의 사용은 변수 이름이 중복될 수 있고, 의도치 않은 재할당에 의한 상태 변화로 코드를 예측하기 어렵게 만들 수 있으므로 사용을 지양하는 것이 좋다.
이러한 문제점들을 해결하기 위해 ES6
부터 도입된 let
과 const
로 블록 레벨 스코프를 사용할 수 있게 해준다.
let a = 10;
let a = 20; // SyntaxError
const b = 10;
const b = 20; // SyntaxError
let a = 10;
a = 20;
console.log(a); // 20
const b = 10;
b = 20; // TypeError
console.log(b); // 10
블록 레벨 스코프란 모든 코드 블록 (함수, if
, for
, while
, try/catch
...)내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다.
즉 코드 블록 내부에서 선언한 변수는 지역 변수이다.
function f() {
if (true) {
let a = 10;
}
console.log(a); // ReferenceError
}
변수 a
는 코드 블록 내에서만 유효하므로 참조에러가 출력된다.
변수 선언에는 기본적으로 const
를 사용하고, let
은 재할당이 필요한 경우에 한정하여 사용하는 것이 좋으며 이 때 변수의 스코프는 최대한 좁게 만든다.
const
키워드는 의도치 않은 재할당을 방지해 주기 때문에 안전하게 사용할 수 있다.
Reference
https://velog.io/@tlatjdgh3778/var-let-const에-대한-정리-1hu7a9ar
https://velog.io/@97godo/var-let-const-알고-사용하자