15 - let, const 키워드와 블록 레벨 스코프

2022. 9. 6.·🎨 프론트엔드 공부/JS & TS

모던 자바스크립트 Deep Dive 정리

var 키워드로 선언한 변수의 문제점

1. 변수 중복 선언 허용

▶ let, const에서는 에러가 발생하지만, var에서는 허용된다

 

var x = 1;
var y = 1;

// var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언을 허용한다.
// 초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작한다.
var x = 100;
// 초기화문이 없는 변수 선언문은 무시된다. (에러를 발생시키지도 않음)
var y;

console.log(x); // 100
console.log(y); // 1

 

2. 함수 레벨 스코프

▶ let, const는 블록 레벨 스코프이지만, var는 함수 레벨 스코프

▷ var는 함수 블록 이외의 코드 블럭은 별개의 스코프로 인정하지 않음

3. 변수 호이스팅

▶ var 키워드도 값을 할당하기 전에는 undefined를 출력할 뿐이다

▶ var 키워드로 선언한 변수는 런타임 이전에 선언 단계와 초기화 단계가 한번에 일어난다

 

// 이 시점에는 변수 호이스팅에 의해 이미 foo 변수가 선언되었다(1. 선언 단계)
// 변수 foo는 undefined로 초기화된다. (2. 초기화 단계)
console.log(foo); // undefined

// 변수에 값을 할당(3. 할당 단계)
foo = 123;

console.log(foo); // 123

// 변수 선언은 런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 실행된다.
var foo;

 

let 키워드

1. 변수 중복 선언 금지

2. 블록 레벨 스코프

3. 변수 호이스팅 -  사실상 불가

▶ let 키워드는 할당 전에 참조하면 레퍼런스 에러를 발생시킨다

 

console.log(foo); // ReferenceError: foo is not defined
let foo;

 

▶ 이는 let 키워드로 선언한 변수는 선언 단계와 초기화 단계가 분리되어 진행되기 때문이다

▷ 선언 단계는 런타임 이전에 암묵적으로 실행되지만

▷ 초기화 단계를 변수 선언문에 도달했을때 실행된다

 

TDZ (Temporal Dead Zone)

▶ 일시적 사각지대

▷ 스코프 시작지점부터 초기화 직전까지 변수를 참조할 수 없는 구간

 

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

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

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

 

▶ let 키워드로 선언한 변수도 여전히 호이스팅이 발생하긴 한다

▷ 아래 코드에서 전역변수 foo가 있음에도 출력하지 않고 코드블럭 내의 foo가 호이스팅된다

▷ 출력은 되지 않으나 변수가 선언된 것은 인식한다

 

let foo = 1; // 전역 변수

{
  console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
  let foo = 2; // 지역 변수
}

 

▶ ES6의 모든 선언( var, let, const, function,  class 등 )은 변수 호이스팅이 가능하다

▷ let, const, class 는 변수 호이스팅이 발생하지 않는것처럼 동작한다

const 키워드

1. 선언과 초기화

▶ const 키워드로 선언한 변수는 반드시 선언과 동시에 초기화해야한다

 

const foo = 1;
const bar; // SyntaxError: Missing initializer in const declaration

2. 재할당 금지

3. 상수

▶ 상수는 대문자로 표기하는 것이 원칙이다

▷ 언더스코어를 활용해 스네이크 케이스로 표기한다

 

가급적 const를 사용하고, 재할당이 필요한 경우에만  제한적으로 let을 사용한다

'🎨 프론트엔드 공부/JS & TS' 카테고리의 다른 글
  • 17 - 생성자 함수에 의한 객체 생성
  • 16 - 프로퍼티 어트리뷰트
  • 14 - 전역 변수의 문제점
  • 13 - 스코프
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (516)
      • 🎨 프론트엔드 공부 (253)
        • JS & TS (92)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
15 - let, const 키워드와 블록 레벨 스코프
상단으로

티스토리툴바