변수에 함수를 담아서 함수를 선언하는 방식을 함수 표현식이라고 하는데, 함수를 변수에 담고 있기 때문에 변수 호이스팅과 똑같이 동작함
var의 경우, 환경레코드에 기록되어 있는 study의 값은 undefined이고, 해당 데이터 타입은 함수와 달리 호출될 수 없기 때문에 Type Error 발생
const의 경우, 환경레코드에 기록되어 있는 값이 없기에 Reference Error 발생
함수를 변수에 담지 않고, function 키워드로 선언하는 방식을 함수 선언문이라고 하며, 선언과 동시에 함수가 생성되어 선언 전에도 함수 사용 가능
JS 엔진에 study 함수의 선언과 동시에 완성된 함수 객체({study : f{}})를 생성해서 환경레코드에 기록. 에러 없이 실행 가능.
현재 활성화된 실행 컨텍스트의 환경레코드를 먼저 봄. 없으면 outer가 가리키는 바깥 렉시컬 환경에서 찾음. 또 없으면 다시 outer로 바깥 렉시컬 환경 반복. 전역 실행 컨텍스트에서 다 찾아도 없으면 Reference Error.
현재 활성화된 실행 컨텍스트(콜 스택 최상위) (3층)에 없으면, outer가 가리키는 바깥 렉시컬 환경(2층)에서 찾음. 있으면, 더 이상 바깥 렉시컬 환경(1층)으로 가지 않음. 2층의 lamp와 1층의 lamp가 같은 이름이기 때문에, 즉 식별자가 같기 때문에, 1층의 lamp가 켜져있는지 꺼져있는지는 알 수 없다. 이를 변수 섀도잉이라 하며, 이는 동일한 식별자로 인해 상위 스코프에서 선언된 식별자의 값이 가려지는 현상이다.
식별자 결정 - 코드에서 변수나 함수의 값을 결정하는 것 (콜 스택 안에 동일한 식별자가 여럿일 때, JS 엔진이 어떻게 outer를 활용해서 의사결정을 할까?)
이전 렉시컬 환경을 가리키는 outer로 타고타고 갈 수 있다. 여기서 스코프 체인이라는 용어가 나오며, 식별자를 결정할 때 활용하는 스코프들의 연결리스트라는 뜻이다.
핵심 키워드 정리