
console.log(score); //undefined
var score = 8;console.log(score); //ReferenceError: Cannot access 'score' before initialization
let score = 8;let score = 1; // 전역 변수
{
console.log(score); // ReferenceError: Cannot access 'score' before initialization
let score = 90; // 지역변수
} 나는 처음 코드를 읽었을 때 ‘console.log(score)를 했으면, 전역변수에서 참조할 식별자인 score이 이미 있기 때문에 1이 출력되어야 하는 것이 아닌가?’ 라는 생각이 들었다. 여기서 ‘1이 출력되지 않았다‘는 것 자체가 let 키워드의 호이스팅을 증명한다. 하지만 코드는 에러가 나 멈추기 때문에 ‘호이스팅이 일어나지 않는 것 처럼’ 동작했다.
뭔가 이해하고 나서 그림을 남겨두면 도움이 되는 것 같다. 내가 이해한 대로 그려본 var와 let, const의 차이가 담긴 도식을 하나 그려봤다.
코드가 실행되면 우리가 작성한 코드는 모든 선언들이 실행되는 ‘소스코드 평가’과정과 나머지 코드들이 실행되는 ‘런타임’ 과정의 두 단계를 걸쳐 실행된다. 파란색 화살표로 그 구간을 나누어 두었다.
각 구간별로 살펴보며 var와 const,let의 차이가 어디에서 발생하는지 알아보자
소스코드 평가단계
모든 ‘선언’들이 처리된다. 어떤 키워드로 선언했든, 모든 변수들은 ‘선언’된다.
그리고 var와 let-const 키워드의 차이는 선언 이후에 발생한다.
var 키워드는 선언과 동시에 undefined로 초기화 과정을 거치고,
const, let 키워드는 선언이 끝이다.
런타임
이제 코드가 실행된다.
var와 let, const의 차이는 소스코드 평가과정시 값의 초기화 여부에서 발생한다~