Uncaught SyntaxError: Unexpected token 'class'
라는 에러가 뜬다. let
은 let is disallowed as a lexically bound name
이라는 에러가 나온다. 답은 var let = 1;
이라고 코드를 쳐보면 나온다.
var let = 1;
은 에러 없이 잘 실행된다.그 이유는
let
이라는 문법이 ES6 이후로 추가된 문법이기 때문이다.
그래서 사실let
은 예약어가 아니다. 뒤늦게 추가되었기 때문에 위와같이 다른 에러로 처리를 한 것이다
🧐 그럼 왜? 예약어로 추가하지않고 새로 추가했을까?
🧐그럼 왜 굳이 var가 있는데 let를 추가했을까?🤔
이유는 간단하다. 문제가 있어서 보완하기위해 추가된 것!
var
는 호이스팅(hoisting)이 일어나기 때문에 변수를 선언하기 전에도 사용할 수 있으며, 함수 스코프를 가지기 때문에 의도하지 않은 변수의 전역화 현상이 발생할 수 있다.let
은 호이스팅이 발생하지 않고,변수의 범위를 더 명확하게 제어할 수 있는 점에서 차이가 난다.
// 코드예시 1: 함수 스코프와 호이스팅
console.log(x); // undefined
var x = 10;
console.log(x); // 10
console.log(y); // ReferenceError: y is not defined
let y = 20;
console.log(y); // 20
let
은 변수 재선언을 허용하지 않습니다. var
는 같은 이름의 변수를 중복해서 선언할 수 있는 반면, let
은 중복된 변수 선언 시 SyntaxError
를 발생시킨다.
// 코드예시 2: 변수 재선언
var a = 30;
var a = 40; // 재선언이 가능
console.log(a); // 40
let b = 50;
let b = 60; // SyntaxError: Identifier 'b' has already been declared
console.log(b);
var
키워드로 선언된 변수는 함수 스코프를 가지며, 함수 내에서 선언된 변수는 해당 함수 전체에서 접근할 수 있다.(전역변수가 되어 버린다.)let
은 블록 스코프 변수로 변수가 선언된 블록({}) 내에서만 유효하며, 블록 외부에서는 접근할 수 없어, 제어하기 좋아졌다.
// 예시 3: 블록 스코프
function varExample() {
var x = 70;
if (true) {
var x = 80; // 외부에서 선언한 x와 같은 변수
console.log(x); // 80
}
console.log(x); // 80
}
varExample();
function letExample() {
let y = 90;
if (true) {
let y = 100; // 블록 내에서만 유효한 새로운 변수
console.log(y); // 100
}
console.log(y); // 90
}
letExample();
이러한 이유로 let이 ES6에 추가가 되었고, 위와 같은 에러가 나는 것이다!