qqggaa
65
2021-04-12 00:27:20
7
317

JS) let과 호이스팅에 관해서 질문 있습니다


let foo = 1;

{

console.log(foo) // ReferenceError <<===여기서 왜 레퍼런스 에러가 뜨는지 이해가 안됩니다.

let foo = 2;

}



제가 생각하는 순서는 이렇습니다


//1.let 선언됨(호이스팅)

//2.TDZ(temporal Dead Zone)

let foo = 1; // 3.let foo선언될때 foo===undefined로 초기화   ==>>  4. foo === 1 할당

{

console.log(foo) // foo값인 1출력

let foo = 2; // 중복선언이므로 에러

}


1.선언단계 - 2.TDZ - 3.초기화단계 - 4.할당단계로 나누어서 설명 해주시면 감사하겠습니다.

2
  • 답변 7

  • 언비튼
    35
    2021-04-12 01:40:52 작성 2021-04-12 01:41:56 수정됨

    일단 let은 var과 달리 블록레벨스코프를 가집니다,

    때문에 let foo = 1; 부분은 아래 블록과는 연관되어지는 부분이 없습니다.

    var은 선언과 동시에 초기화(= undefined)되지만 let은 선언과 동시에 초기화되지 않습니다.

    초기화 단계로 넘어가지 않았기 때문에 TDZ 에 있는 변수 foo는 Reference Error가 나오게 됩니다.

  • qqggaa
    65
    2021-04-12 01:42:56 작성 2021-04-12 01:43:34 수정됨

    늦은시간에 답변 감사합니다

    제 의문은 이렇습니다 : console.log(foo)가 실행되는 시점에서는 이미 foo라는값에 1이 할당되어있는것이 아닌지요?

  • 언비튼
    35
    2021-04-12 02:00:53

    @qqggaa

    let은 var과 달리 블록레벨스코프입니다.

    코드 블록 내에 선언된 변수 foo(호이스팅 된)를 사용하게 됩니다.

  • qqggaa
    65
    2021-04-12 02:03:27 작성 2021-04-12 02:14:52 수정됨

    @언비튼

    블록 바깥에 있는 foo와 블록 안에있는 foo가 애초에 다르기 때문에 블록안에 있는 foo가 1로 할당된게 아니라는 말씀이신가요?

    블록안의 foo와 블록 바깥에 있는 foo가 각각 호이스팅되는것 맞나요?

  • 언비튼
    35
    2021-04-12 02:20:05

    @qqggaa

    네 const / let / var 과 스코프에 대해서 알아보세요
    블록 안의 foo는 블록의 맨 위로 호이스팅됩니다.

    let foo = 1
    {
      let foo // 선언되었지만, 초기화가 되어 있지 않아 Reference Error
      console.log(foo)
      foo = 2
    }


  • qqggaa
    65
    2021-04-12 02:26:43

    @언비튼 늦은 새벽에 답변 정말 감사합니다. 좋은 새벽 보내셨으면 좋겠습니다.

  • richard7
    1k
    2021-04-12 06:57:48
    let이 스코프 내에서 호이스팅 되는 건 처음 알았습니다.. 두분 모두 감사합니다 !
  • 로그인을 하시면 답변을 등록할 수 있습니다.