변수 선언을 여러 번해도 에러 없이 각기 다른 값을 출력할 수 있다.
이러한 점은 필요할 때마다 변수를 사용할 수 있기때문에 편리하다는 장점이 있지만 같은 이름의 변수명을 남용하는 문제가 발생할 수도 있기 때문에 장점보다 단점이 더 크다고 할 수 있다.
이러한 단점을 보완하기 위해 ES6부터 let, const가 추가되었다.
let은 변수의 재할당은 가능하지만 var처럼 재선언은 되지 않는다.
const의 경우 constant(상수)의 의미 그대로 한 번만 선언이 가능하고 한번 선언된 값은 재할당을 통해 바꿀 수 없다.
호이스팅이란 함수 안에 있는 선언을 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 의미한다. var로 선언한 변수의 경우 호이스팅이 발생해 최상위로 변수 선언이 옮겨졌지만 let의 경우에는 호이스팅이 발생하지 않는다.
때문에 var로 코드를 작성하는 경우에는 호이스팅이 발생해서 같은 이름의 변수나 함수로 값이 변질될 수 있다. 호이스팅이 자주 일어나는 코드의 경우 유지보수가 어려워지며, 쓸모없는 코드가 생길 수 있다.
스코프는 범위라는 뜻을 갖고 있다. 즉 변수에 접근할 수 있는 범위를 의미하며, 전역 스코프(global scope)와 지역 스코프(local scope)가 있다.
브라우저를 기준으로 변수가 함수 바깥이나 중괄호 바깥에 선언되었다면 전역 스코프에 정의된다고 볼 수 있다. 전역 스코프에 정의된 변수를 전역 변수라고 한다. 전역 변수를 선언하면 코드 모든 곳에서 해당 변수를 사용할 수 있다.
전역 스코프와는 다르게 특정 부분에서만 사용 가능한 변수는 지역 스코프 내에 포함되어 있다고 할 수 있고 이런 변수를 지역 변수라 칭한다. 자바스크립트에는 함수 스코프와 블록 스코프 두 개의 지역 스코프가 존재한다. 여기서 말하는 블록은 {...}을 의미하며, 이 블록을 벗어난다면 블록 내부에 선언된 변수를 참조할 수 없다.
선언된 함수의 내부 어느 곳에서라도 접근이 가능하다.
블록 스코프는 블록 내부에서 선언한 변수는 블록 외부에서 사용할 수 없다.