
자바스크립트에서 변수를 선언할 때 사용되는 키워드로는 var, let, const가 있다.
스코프와 호이스팅에 대해 설명 후 var, let, const의 특성을 중복 선언 허용 여부, 스코프, 호이스팅과 관련하여 비교해 보려고 한다.
스코프는 함수 스코프와 블록 스코프로 나뉜다.
function exampleFunction() {
var localVar = 10;
console.log(localVar); // 10
}
exampleFunction();
console.log(localVar); // ReferenceError: localVar is not defined
{}로 둘러싸인 블록 내에서 선언되었을 때 해당 블록 내에서만 유효한 범위를 가진다.if (true) {
let blockVar = 20;
console.log(blockVar); // 20
}
console.log(blockVar); // ReferenceError: blockVar is not defined
호이스팅은 자바스크립트에서 변수 및 함수 선언이 스코프의 최상단으로 끌어올려지는 현상이다. 이 현상은 코드 실행 전에 발생하며, 선언부가 실제로 코드에서 위치한 곳과는 상관없이 동작한다. 변수 호이스팅과 함수 호이스팅으로 나뉜다. 변수와 함수 선언문이 호이스팅은 되지만, 할당(초기화)은 호이스팅되지 않는다.
console.log(x); // undefined
var x = 5;
console.log(x); // 5
위 코드에서 변수 x는 선언되기 전에 참조되었으나, 호이스팅에 의해 선언부가 코드의 맨 위로 끌어올려지기 때문에 에러가 발생하지 않고 undefined로 초기화된다.
sayHello(); // "Hello, World!"
function sayHello() {
console.log("Hello, World!");
}
위 코드에서 함수 sayHello()가 선언되기 전에 호출되었지만, 함수 선언문은 호이스팅에 의해 코드의 맨 위로 끌어올려지기 때문에 정상적으로 실행된다.
undefined가 된다.console.log(foo); // undefined
var foo = "Hello";
console.log(foo); // "Hello"
SyntaxError가 발생{}로 구분된 코드 영역, 따라서 if문이나 for문 등의 블록 내에서 선언된 변수는 블록 외부에서 접근 불가ReferenceError가 발생한다.console.log(bar); // ReferenceError: Cannot access 'bar' before initialization
let bar = "World";
TypeError 발생SyntaxError가 발생{}로 구분된 코드 영역, 따라서 if문이나 for문 등의 블록 내에서 선언된 변수는 블록 외부에서 접근 불가ReferenceError가 발생한다.const PI = 3.14;
PI = 3.14159; // TypeError: Assignment to constant variable.
console.log(bar); // ReferenceError: Cannot access 'bar' before initialization
const bar = "World";
| var | let | const | |
|---|---|---|---|
| 중복 선언 | 가능 | 불가 | 불가 |
| 스코프 | 함수 스코프 | 블록 스코프 | 블록 스코프 |
| 호이스팅 | 선언 전 접근 가능 | 선언 전 접근 불가 | 선언 전 접근 불가 |
var, let, const는 각각의 스코프와 변수 재할당에 대한 특징이 다르기 때문에 상황에 맞게 적절히 선택하여 사용해야 한다. 일반적으로 변수를 선언할 때는 let을 사용하며, 상수 값이 필요한 경우에는 const를 사용한다. var는 ES6 이전 코드와의 호환성을 위해 사용하지 않는 편이다.