일요일.. 이라닛 내일은 출근을 한다. 아무 생각 없이 갈듯 하다 별 느낌은 없으니까..!
let const 키워드와 블록 레벨 스코프에서 살펴보았듯이 var 키워드로 선언한 변수는 오로지 함수의 코드 블록만 지역 스코프로 인정하는 함수 레벨 스코프를 따른다. 하지만 let const 로 선언한 변수는 모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다
let x = 1;
if (true) {
let x = 10;
console.log(x); // 10
}
console.log(x); // 1
전역에 x와 다르게 if 문의 코드 블록 내에서 let 키워드로 변수가 선언되었다. if 문의 코드 블록을 위한 블록 레벨 스코프를 생성해야 한다. 이때 새롭게 생성된 if 문의 코드 블록을 위한 렉시컬 환경의 외부 렉시컬 환경에 대한 참조는 if 문이 실행되기 이전의 전역 렉시컬 환경을 가리킨다.
따라서 if문 코드 블록의 실행이 종료되면 if 문의 코드 블록이 실행되기 이전에 렉시컬 환경으로 되돌린다. 하여 마지막
console.log(x) 에서 1이 출력되는 것을 볼수 있다.
물론 if 문뿐 아니라 블록 레벨 스코프를 생성하는 모든 블록문에 적용된다.
for 문의 변수 선언문에 let 키워드를 사용한 for 문은 코드 블록이 반복해서 실행될 때마다 코드블록을 위한 새로운 렉시컬 환경을 생성한다. 만약 for 문의 코드 블록 내에서 정의된 함수가 있다면 이 함수의 상위 스코프는 for 문의 코드 블록이 생성한 렉시컬 환경이다.
이를 위해 for 문의 코드 블록이 반복해서 실행될 때마다 독립적인 렉시컬 환경을 생성하여 식별자의 값을 유지한다. 이에 대해서는 다음 24장에서 다뤄볼 예정이다.
오늘은 여기까지..!