자바스크립트 에서 변수는 var, let, const
세 가지 키워드로 선언 할 수 있다.
세 가지 키워드의 차이점을 알아보기 이전에, 자바스크립트는 다음과 같은 특징을 가지고 있다.
자바스크립트 엔진은 코드를 한 줄씩 순차적으로 실행하기 전에,
선언문 (변수 선언문, 함수 선언문 등)을 찾아내 먼저 실행시킨다.
즉, 변수 선언이 어디에 있든 상관 없이 해당 스코프의 최상단에서 먼저 선언하는 특징 (호이스팅) 을 가지고 있다.
foo 라는 변수를 선언과 동시에 값을 할당해주었으나, 선언문은 런타임 이전에 호이스팅 되어 실행되므로 암묵적으로 undefined가 할당되어 다음과 같은 결과가 나온다.
console.log(foo); // undefined
var foo = 1;
console.log(foo); // 1
var
는 다음과 같은 특징을 가지고 있다.
console.log(foo); // undefined (호이스팅 되면서 초기화)
var foo = 1;
console.log(foo); // 1
var foo = 1;
console.log(foo); // 1
// 재할당
foo = 2;
console.log(foo); // 2
// 재선언
var foo = 3;
console.log(foo); // 3
var foo = 1;
// 블록 레벨 스코프
if (true) {
var foo = 3;
}
console.log(foo); // 3
// 함수 레벨 스코프
(function() {
var foo = 123;
console.log(foo); // 123 (함수 레벨 스코프에서 선언/초기화 됨, 재선언x)
})();
console.log(foo); // 3
let
은 다음과 같은 특징을 가지고 있다.
console.log(foo); // Uncaught ReferenceError: foo is not defined
let foo;
let foo = 1;
foo = 2;
console.log(foo); // 2
let foo = 3; // Uncaught SyntaxError: Identifier 'foo' has already been declared
let foo = 1;
if (true) {
let foo = 3;
}
console.log(foo); // 1
// for문 조건에 사용되는 foo와 for문 내부에 사용되는 foo는 서로 다른 블록 스코프 이다.
for (let foo = 0; foo < 10; foo++) {
let foo = 3;
}
console.log(foo); // 1
const
는 다음과 같은 특징을 가지고 있다.
console.log(bar); // Uncaught ReferenceError: bar is not defined
const foo = 1;
console.log(foo); // 1
const bar; // Uncaught SyntaxError: Missing initializer in const declaration
const foo = 1;
const foo = 2; // Identifier 'foo' has already been declared
foo = 3; // Uncaught TypeError: Assignment to constant variable.
const bar = { baz: 123 };
bar.baz = 456;
console.log(bar.baz); // 456
const baz = [1, 2, 3];
baz[0] = 4;
console.log(baz); // [4, 2, 3];
const foo = 1;
if (true) {
const foo = 3;
}
console.log(foo); // 1