자바스크립트
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-알고-사용하자