개발일지/JavaScript
시간상 사각지대 TDZ
한삐
2022. 8. 16. 23:40
728x90
TDZ란 일시적/시간적 사각지대로, 스코프의 시작-(TDZ)-초기화 시작 사이의 구간을 의미한다.
스코프의 시작- (TDZ) -초기화 시작
즉, 변수가 선언되고 변수의 초기화가 이뤄지기 전까지의 구간이다.
이 구간의 변수를 TDZ에 들어간 변수라고 표현한다.
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError
var bar = 1;
let foo = 2;
}
시간상 사각지대인 이유는, 사각지대가 코드의 작성 순서(위치)가 아닌,
코드의 실행 순서(시간)에 의해 형성되기 때문에다.
ex) let 변수 선언이 변수에 접근하는 함수보다 아래여도 함수의 호출 시점이 사각지대 밖인 경우
{
// TDZ가 스코프 맨 위에서부터 시작
const func = () => console.log(letVar); // OK
// TDZ 안에서 letVar에 접근하면 ReferenceError
let letVar = 3; // letVar의 TDZ 종료
func(); // TDZ 밖에서 정상적으로 호출
}
참조할 만한 예제(let/var 스코프의 차이점)
블록 내에서 사용한 경우
let은 변수의 스코프를 해당 블록으로 제한하고,
var는 스코프를 함수로 제한한다는 차이가 있다.
var a = 1;
var b = 2;
if (a === 1) {
var a = 11; // 전역 변수
let b = 22; // if 블록 변수
console.log(a); // 11
console.log(b); // 22
}
console.log(a); // 11
console.log(b); // 2
var는 쓰지 말래서 안썼는데 이런 차이가 있었구나 싶다.
728x90