TDZ는 함수에 적용되는 것과 마찬가지로 블록에도 적용된다.
function blockExample(str) {
let p = "prefix"; // 바깥 'p' 선언
if (str) {
p = p.toUpperCase(); // ReferenceError: 'p' is not defined
str = str.toUpperCase();
let p = str.indexOf("X"); // 내부 'p' 선언
if (p != -1) {
str = str.substring(0, p);
}
}
return p + str;
}
블록 내부의 첫 번째 줄에는 p를 사용할 수 없다. 왜냐하면 함수에서 선언되었더라도 p 식별자의 소유권을 갖는 블록 내부에 섀도잉(shadowing) 선언이 있기 때문이다. 따라서 식별자는 let 선언이 실행된 후에만 새로운 내부 p를 참조할 수 있다. 이것은 코드가 어떤 p를 사용하고 있는지에 대한 혼동을 방지한다.