공부
[JS] var, let, const - 스코프, 중복선언, 재할당, 호이스팅
hahihuree
2021. 9. 15. 12:04
스코프 | 중복선언 | 재할당 | 호이스팅 | |
var | 함수레벨 | O | O | O |
let | 블록레벨 | X | O | X |
const | 블록레벨 | X | △ | X |
스코프
함수레벨 스코프
- 함수 내수에서 선언된 변수는 함수 내부에서만 유효.
- 즉, 함수 내부에서 선언한 변수는 지역변수이고 함수 외부에서 선언한 변수는 전역 변수.
블록레벨 스코프
- 코드 블록( { } ) 내에서 선언된 변수는 코드 블록 내에서만 유효.
- 즉, 코드 블록 외부에서 참조할 수 없다.
중복선언
- var는 중복선언이 가능해 예기치 못한 값을 반환할 수 있다.
- var는 함수레벨 스코프라, 함수 외부에서 선언된 변수는 모두 전역변수다.
- 변수 선언문 이전에 변수를 참조하면 언제나 undefined를 반환한다.
이러한 var의 문제점을 해결하기 위해 중복 선언이 불가능한 let과 const 등장.
재할당
- const가 let과 다른 점은 재할당이 불가능하다.
- 하지만 위의 표에서 △로 표시했듯 아주 불가능 한것은 아니다.
- 원시 값(숫자, 문자열, 불리언, undefined, null, symbol)은 재할당이 불가능하지만 객체는 가능하다.
- 즉, 재할당을 금지할 뿐, 불변을 의미하는 것은 아니다.
어떻게 객체(Object)는 가능한가?
- 객체(Object)가 변수에 할당될 때는, 객체 차제가 할당되는게 아니라 객체의 주소가 할당된다.
- 이 주소값이 불변이고 그 안의 key-value를 추가하거나 변경하는 것은 가능하다.
호이스팅
자바스크립트 엔진은 모든 선언문을 호이스팅한다.
* 호이스팅: 선언이 어디에 있든 상관 없이 다른 코드보다 먼저 실행
let
- let으로 선언한 변수는 선언과 초기화가 분리되어 진행된다.
- 선언과 초기화 사이에 일시적 사각지대(TDZ)에 빠진다.
- 따라서 초기화 이전에 변수에 접근하려고 하면 참조에러(ReferenceError)가 뜬다.
const
- const로 선언한 변수는 선언과 초기화가 동시에 진행된다.
- 하지만 런타임 이전에는 실행될 수 없어 초기화가 진행되지 않은 상태이기 때문에 Cannot access~에러문구가 뜬다.
var대신 let과 const를 사용하여 변수를 선언하고 상수라면 const를 사용하는 것이 안전하다.