var 키워드 문제점

1. 변수 중복 선언 허용

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

2. 함수 레벨 스코프

var x = 1;

// 코드 블록(블록 레벨), 하지만 var 는 함수 레벨 스코프
// 고로, 블록 내 x변수는 전역 변수 처럼 스코프가 적용
{
  var x = 10;
}

console.log(x);     // 10

3. 변수 호이스팅

변수호이스팅

console.log(foo);   // undefined << foo 변수 암묵적 선언 & 초기화 (호이스팅)

foo = 123;          // foo변수 값 할당

console.log(foo);   // 123 

var foo;

let 키워드

let 키워드ES6 에 도입되어 var 키워드의 단점을 보완하기 위해 등장

1. 변수 중복 선언 금지

// 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에 대한 출력문 실행이 진행 안됨

2. 블록 레벨 스코프