let const & 블록 레벨 스코프

어승준·2023년 10월 25일

JS 스터디

목록 보기
21/26
post-thumbnail

📌 블록 레벨 스코프와 함수 레벨 스코프에 대해서 설명해주세요

  • 블록 레벨 스코프
    • 모든 코드 블록(함수, if 문, for 문, while 문, try/catch 문 등) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다. 즉, 코드 블록 내부에서 선언한 변수는 지역 변수이다.
    • let, const가 블록 레벨 스코프 갖습니다.
  • 함수 레벨 스코프
    • 함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉, 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선언한 변수는 모두 전역 변수이다.
    • var 가 함수 레벨 스코프에 속합니다.

📌 let 키워드로 선언한 변수의 생명 주기에 대해서 설명해주세요

  • let은 선언 단계, 초기화 단계 그리고 할당 단계가 분리되어 실행됩니다.
  • 선언 단계는 런타임(평가단계)에서 실행이 되지만 초기화 단계는 선언문에 도달했을때 실행이 됩니다.
  • let 키워드로 변수의 선언 단계부터 초기화 단계(선언문)가 이루어지기 전까지 참조할 수 없는 구간을 일시적 사각지대라고 합니다.
// 런타임 이전에 선언 단계 실행
console.log(letVariable); // Uncaught ReferenceError: letVariable is not defined
let letVariable; // 선언문 도달에 초기화 단계 실행
console.log(letVariable); // undefined
letVariable = 10; // 할당문에 할당 단계 실행
console.log(letVariable); // 10


📌 var로 변수를 선언하는 방식이 왜 더 이상 권장되지 않을까요?

  • 변수 중복 선언 허용
    • 의도치 않은 변수 재할당과 값의 변경이 발생할 수 있으며 디버깅이 어려워집니다.
      함수 레벨 스코프:
  • 함수 레벨 스코프
    • 함수 내에서 선언한 변수는 함수 내부 어디서든 접근 가능합니다. 이는 예상치 못한 변수의 값 변화와 충돌을 초래할 수 있습니다.
  • 변수 호이스팅
    • 변수 선언이 스코프의 맨 위로 끌어올려지기 때문에, 변수가 선언되기 전에도 해당 변수를 사용할 수 있습니다. 이는 프로그램의 동작을 예측하기 어렵게 만들며 오류를 발생시킬 수 있습니다.

📌 var과 let, const를 각각 언제 사용하는 것이 좋은가요?

  • 변수 선언에는 기본적으로 const를 사용하고 let은 재할당이 필요한 경우에 한정해 사용하는 것이 좋다. 원시 값의 경우, 가급적 상수를 사용하는 편이 좋다. 그리고 객체를 재할당하는 경우는 생각보다 흔하지 않다. const 키워드를 사용하면 의도치 않은 재할당을 방지해 주기 때문에 보다 안전하다.

  • var와 let, 그리고 const는 다음처럼 사용하는 것을 추천한다.

    • ES6를 사용한다면 var 키워드는 사용하지 않는다.
    • 재할당이 필요한 경우에 한정해 let 키워드를 사용한다. 이때 변수의 스코프는 최대한 좁게 만든다.
    • 변경이 발생하지 않는(재할당이 필요 없는 상수) 원시 값과 객체에는 const 키워드를 사용한다.
  • const 키워드는 재할당을 금지하므로 var, let 보다 안전하다.
    변수를 선언하는 시점에는 재할당이 필요할지 잘 모르는 경우가 많다. 그리고 객체는 의외로 재할당을 하는 경우가 드물다. 따라서 변수를 선언할 때에는 일단 const 키워드를 사용하도록 하자. 반드시 재할당이 필요하다면(반드시 재할당이 필요한지 한번 생각해 볼 일이다.) 그때 const를 let 키워드로 변경해도 결코 늦지 않는다.


📌 let과 const는 왜 호이스팅이 발생하지 않는 것처럼 보이나요?

  • let과 const로 선언된 변수는 스코프 내에서 호이스팅되지만, 초기화되기 전에는 일시적 사각지대(Temporal Dead Zone)에 있습니다. 이는 변수가 선언된 위치부터 초기화되는 위치까지의 범위를 의미합니다.
  • TDZ에서 변수에 접근하려고 하면 ReferenceError가 발생합니다. 즉, 변수가 선언되었지만 초기화되기 전에는 사용할 수 없습니다.
profile
鈍筆勝聰(둔필승총) : '둔한 붓이 총명함을 이긴다' (서툴더라도 기록으로 남기는 것이 사람의 기억보다 훨씬 오래 보전된다) - 정약용

0개의 댓글