[JavaScript] let, const, scope

희철·2023년 12월 29일
1
post-custom-banner

var

  • 중복선언 가능하다.
  • 함수 레벨 스코프
  • 변수 호이스팅
// 이 시점에는 변수 호이스팅에 의해 이미 abc 변수가 선언 되었다.(1.선언 단계)
// 변수 abc는 undefined로 초기화된다. (2.초기화 단계)
console.log(abc); // undefined

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

console.log(abc); // 94

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

let

  • 변수 중복 선언 금지
  • 블록 레벨 스코프
let abc = 9; // 전역 변수
{
	let abc = 4; // 지역 변수
  	let bca = 2;// 지역 변수
}
console.log(abc); //9
console.log(bca); // ReferenceError: bca is not defined
  • 선언 단계초기화 단계가 분리되어 진행된다.

TDZ

일시적 사각지대 / Temporal Dead Zone

	// 런타임 이전에 선언 단계가 실행된다. 아직 변수가 초기화되지 않았다.
    // 초기화 이전의 일시적 사각지대에서는 변수를 참조할 수 없다.
    console.log(abc); // ReferenceError: abc is not defined
    
    let abc; // 변수 선언문에서 초기화 단계가 실행된다.
    console.log(abc); // undefined
    
    abc = 94; // 할당문에서 할당 단계가 실행된다.
    console.log(abc); // 94
    
    위의 예시로는 호이스팅이 발생하지 않는 것처럼 보인다.
    
    let qqq = 94; // 전역 변수
    {
    	console.log(qqq); // ReferencError: Cannot acces 'qqq' before initialization
        let qqq = 1; // 지역 변수
    }

호이스팅이 발생하지 않는다면 94가 출력 돼야한다. 하지만 분리된 선언 단계에 걸려 지역 변수의 qqq를 참조하게 돼고 참조 에러가 발생했다.

const

  • 상수를 선언하기 위해 사용한다.
  • 선언과 동시에 초기화 해야한다.
  • 블록 레벨 스코프, 호이스팅이 발생하지 않는 것처럼 동작한다.
  • 재할당 금지
  • const로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있다.
    • 객체의 주소값을 할당 했기 때문

참고: 모던 자바스크립트 Deep Dive

post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 1월 6일

오 tdz 벌써 찾아보셨네요 저는 생각만하고 아직 안 찾아봤는데 여기서 공부하고 갑니다 캬

답글 달기