Post

Deep Dive 15. let, const 키워드와 블록 레벨 스코프

let 키워드

let 키워드 특징

  • 변수 중복 선언 금지
  • 블록 레벨 스코프
  • 변수 호이스팅

let 키워드로 선언한 변수는 “선언 단계”와 “초기화 단계”가 분리되어 진행된다. 만약 초기화 단계가 실행되지 이전에 변수에 접근하려고 하면 참조 에러가 발생한다. let 키워드로 선언한 변수는 스코프의 시작 지점부터 초기화 단계 시작 지점(변수 선언문)까지 변수를 참조할 수 없다. 스코프의 시작 지점부터 초기화 시작 지점까지 변수를 참조할 수 없는 구간을 일시적 사각지대(TDZ)라고 부른다.

1
2
3
4
5
6
7
8
9
// 런타임 이전에 선언 단계가 실행된다. 아직 변수가 초기화되지 않았다.
// 초기화 이전의 일시적 사각지대에서는 변수를 참조할 수 없다.
console.log(foo); // ReferenceError: foo is not defined

let foo; // 변수 선언문에서 초기화 단계가 실행된다.
console.log(let); // undefined

foo = 1; // 할당문에서 할당 단계가 실행된다.
console.log(foo); // 1

위 글을 보았을 때 let 키워드는 호이스팅을 일으키지 않는 것처럼 보인다.

1
2
3
4
5
let foo = 1; // 전역 변수
{
  console.log(foo); // ReferenceError: Cannot access 'foo' befoe initialization
  let foo = 2; // 지역 변수
}

하지만 위에서 foo를 출력할 때 호이스팅으로 인하여 1을 출력하는 것이 아니라 참조 에러를 발생시킨다.

let 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 아니다. 즉 window.let으로 선언된 변수는 존재하지 않는다.

const 키워드

const 키워드 특징

  • const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야 한다.
  • const 키워드로 선언한 변수는 재할당이 금지 된다.
  • const 키워드로 선언된 변수에 객체를 할당하더라도 그 객체의 값을 변경 할 수 있다.(참조 값 자체는 바뀌지 않기 때문)

var vs. let vs. const

  • ES6를 사용한다면 var 키워드는 사용하지 않는다.
  • 재할당이 필요한 경우에 한정해 let 키워드를 사용한다. 이때 변수의 스코프는 최대한 좁게 만든다.
  • 변경이 발생하지 않고 읽기 전용으로 사용하는(재할당이 필요 없는 상수) 원시 값과 객체에는 const 키워드를 사용한다. const 키워드는 재할당을 금지하므로 var, let 키워드보다 안전하다.
This post is licensed under CC BY 4.0 by the author.