var은 호이스팅이라는 문제점을 발생 시키는데 hoisting은 var을 어디다 선언하든 상관없이 선언을 코드의 위쪽으로 끌어 올려주는 현상이다.
console.log(name);
name = 'dong';
console.log(name);
var name = 'hyun';
var name이라는 변수가 가장먼저 인식이 되고 첫번째 문장인
console.log(name); 가 정상 실행된다. 하지만 호이스팅은 var name까지만 위로 올리고 그 뒤에 할당부분은 가지고 올라가지 않는다.
즉 console.log(name);의 실행결과는 undefined가 나온다.
이러한 문제를 해결하기위해 let과 const가 등장하였고 let과 const는
호이스팅이 발생하지 않는다. let과 const는 기존의 c언어나 자바처럼 변수를 먼저 선언을 하고 그 다음에 사용이 가능하다.
console.log(name); //name이 정의되어있지 안하서 오류 발생
name = 'dong'; //name이 정의되어있지 안하서 오류 발생
console.log(name); //name이 정의되어있지 안하서 오류 발생
let name = 'hyun'; //name이 정의됨
초기 js에서는 var만이 존재하였다. var은 함수기반의 스코프에서 돌아간다.
함수 스코프안에서 var로 작성된 선언문이 한번 실행된다면 그 함수가 종료되기 전까지 유효하다.
보통 함수의 스코프는 전역스코프와 동일하게 작동함으로 var 변수를 사용할 때 함수 스코프와 전역 스코프간에 오류가 발생할수도 있다. 이를 보완하기 위해 2015년도에 ES6의 let 과 const가 나왔다.
let과 const는 함수 스코프에서 적용되는 것이 아니라 블록스코프에서 적용되기 때문에 var에서 발생하던 문제들이 해결된다.
하지만 let고 const도 차이가 있는데
let에 값이 할당된후에도 값이 별할수있지만
const는 값이 할당된후에 재할당할수없다.