study: javascript | 숨참고 deep dive (15) let / const - 220112

Lumpen·2023년 1월 11일
0

Study

목록 보기
18/92

var 의 문제점

var 는 ES5 까지 변수를 선언할 수 있는 유일한 방법이었다
var 는 다른 언어와는 구별되는 독특한 특징을 갖는다

  • 변수 중복 선언 허용
  • 함수 레벨 스코프
  • 변수 호이스팅: 할당과 초기화 동시에 일어나기 때문에 참조 에러가 발생하지 않는다

let 키워드

var 의 단점을 보완하기 위해 나온 변수 선언 키워드

  • 변수 중복 선언 금지
  • 블록 레벨 스코프
  • 변수 호이스팅: 호이스팅은 일어나지만 할당과 초기화가 분리되어 있고 중간에 TDZ가 있어 참조 에러 발생

let 키워드의 호이스팅

런타임 이전에 선언이 실행되고 변수 초기화는 일어나지 않는다
런타임 시 초기화는 변수 선언문에서 일어나고
할당문에서 값의 할당이 일어난다
런타임 이전 변수 선언 실행 (선언 단계) 후
스코프 시작 지점 부터 변수 선언문에서 초기화 까지의
변수를 참조할 수 없는 상태를 일시적 사각지대 (TDZ) 라고 부른다

let foo = 1;

{
	console.log(foo); // Reference Error
    let foo = 2;
}

호이스팅이 일어나지 않는다면 console.log() 에서 1이라는 결과를 주어야 하지만
블록 레벨 스코프를 갖는 let 키워드는 블록 내부에서 호이스팅이 일어난다
console.log() 의 위치가 아직 변수 선언문 이전이기 때문에 참조 에러가 발생하고
해당 위치까지는 TDZ

자바스크립트는 모든 선언에 대해 호이스팅 한다
하지만 ES6 문법인 let, const, class는 호이스팅이 일어나지 않는 것 처럼 동작한다

전역 객체와 let

var 키워드로 전역에서 선언한 함수와 변수, 키워드 없이 선언한 변수 (암묵적 전역) 은
전역 객체의 프로퍼티가 된다
암묵적 전역과 var 는 사용하지 않는다

let 키워드로 선언한 변수는 전역 객체의 프로퍼티가 아니다
let 전역 변수는 렉시컬 환경의 선언적 환경 레코드 내에 존재하게 된다

const 키워드

const 는 상수를 뜻하고 상수로도 사용한다
하지만 변경이 일어나야만 하는 변수를 제외한 모든 변수는 const 로 선언한다

  • 선언과 초기화: const 로 선언한 변수는 반드시 선언과 함께 값을 할당하여 초기화를 해야한다
  • 블록 레벨 스코프
  • 재할당 금지 는 당연히 상수니까

const 키워드와 객체

const 키워드는 상수라고 했지만
해당 키워드로 선언된 변수에 객체를 담는다면
객체 내부의 값을 변경할 수 있다
변수에서 참조하고 있는 값이 객체의 주소이기 때문이다

재할당을 금지할 뿐 불변성을 보장하는 것은 아니다

아마 기존의 모든 자바스크립트 코드를 한 번에 수정할 수 있다면
암묵적 전역 변수와 var 키워드로 선언된 변수는 사라질 것이다..

const 가 기본, let 은 정말 변수

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글