2.1.1 let을 이용한 선언

let을 이용해 재할당이 가능한 블록 레벨 변수를 선언할 수 있다.

let을 이용해 재할당이 가능한 블록 레벨 변수를 선언할 수 있다. 아래 예시 코드를 보자.

{
  let goOut = true;
  if (true) {
    let goOut = false;
  }
  console.log(goOut); // true
  goOut = false;
  console.log(goOut); // false
}
console.log(goOut); // ReferenceError: goOut is not defined.

두 가지 주목할 점이 있다.

  1. let을 이용한 선언은 블록 수준에서 이루어지므로, 대괄호 블록과 if 블록 내에서 goOut의 값을 선언하는 행위는 해당 블록 안에서만 의미를 갖는다.

  2. var을 이용한 선언과 마찬가지로, let으로 선언한 변수를 블록 내에서 재할당할 수 있다.

let으로 선언한 변수는 엄밀한 의미에서 호이스팅 되지만, var로 선언한 변수와 달리 변수의 정의문이 평가되기 전 해당 변수를 참조할 경우 ReferenceError가 발생한다. 이 때 변수 접근이 에러를 발생시키는, 정의문이 평가되기 전까지의 구간을 Temporal Dead Zone이라 한다.

이 부분에 존재했던 오류에 정성스러운 이슈를 제기해주신 한재엽님 감사합니다 :)

function foo() {
  console.log(a);
  let a = 3;
}

foo(); // ReferenceError: a is not defined

또한 var과 다르게 어떤 변수명에 대한 let을 이용한 선언은 한 블록 내에서 한 번만 가능하다.

function ok() {
  var a = 1;
  var a = 2;
  console.log(a);
}
function notOk() {
  let a = 1;
  let a = 2;
  console.log(a);
}
ok(); // 2
notOk(); // SyntaxError: Identifier 'a' has already been declared

Last updated