공부

[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를 사용하는 것이 안전하다.

 

 

 

참고 https://poiemaweb.com/es6-block-scope

참고 https://www.howdy-mj.me/javascript/var-let-const/