var x = 1; // x변수 선언 & 초기화 동시에
var y = 1; // y변수 선언 & 초기화 동시에
var x = 100; // 선언 문 O, 초기화 문도 X
var y; // 선언 문은 O, 초기화 문이 X (암묵적 무시)
console.log(x); // 100
console.log(y); // 1
var x = 1;
// 코드 블록(블록 레벨), 하지만 var 는 함수 레벨 스코프
// 블록 내 x변수는 전역 변수 처럼 스코프가 적용
{
var x = 10;
}
console.log(x); // 10
console.log(foo); // undefined << foo 변수 암묵적 선언 & 초기화 (호이스팅)
foo = 123; // foo변수 값 할당
console.log(foo); // 123
var foo;
ES6에 도입되어 var 키워드의 단점을 보완하기 위해 등장했다.
// var 변수 = 중복 선언 허용 O
var foo = 123;
var foo = 456;
console.log(foo);
// let 변수 = 중복 선언 허용 X
let bar = 123;
let bar = 456; // SyntaxError: Identifier 'bar' has already been declared
console.log(bar);
// 선언 단계 에서 체크하므로 → 위에서 var 변수인 foo에 대한 출력문 실행이 진행 안됨
블록 레벨 스코프
를 따른다.let foo = 1;
{
let foo = 2;
let bar = 3;
}
console.log(foo); // 1
console.log(bar); // ReferenceError: bar is not defined
변수 호이스팅
// 변수 호이스팅 - var 변수
console.log(foo); // undefined
var foo;
console.log(foo); // undefined
foo = 1;
console.log(foo); // 1
// 변수 호이스팅 - let 변수
console.log(foo); // 일시적 사각지대(TDZ) - ReferenceError: Cannot access 'foo' before initialization ( 사실상, 여기서 프로그램 종료 )
let foo; // 변수 선언문에서 초기화 단계가 실행
console.log(foo); // undefined
foo = 1; // 할당문에서 할당 단계가 실행
console.log(foo); // 1
상수를 선언하기 위해 사용한다 (단, 반드시 상수만을 위해서 사용하는 것은 아님)
일반적으로 let 키워드와 특징이 동일하다. 차이점은 다음과 같다.
const foo; // SyntaxError: Missing initializer in const declaration
const foo = 1;
foo = 2; // TypeError: Assignment to constant variable.
const로 상수