https://www.youtube.com/watch?v=EWfujNzSUmw
코드를 실행하기 위한 환경 정보들을 모아노흔 객체로 자바스크립트가 실행되는 환경
hoisting : 선언라인 전에도 변수를 참조할 수 있는 현상
console.log(TVChannel); // undefined
var TVChannel = "Netflix";
console.log(TVChannel) // Netflix
호이스팅이 가능한 이유는 자바스크립트 엔진이 먼저 전체 코드를 스캔하면서 변수 같은 정보를 실행 컨텍스트 어딘가에 기록해 놓는다.
이때 기록해 놓는 곳이 바로 Record(환경 레코드: Environment Record)이다.
생성 : 선언문만 실행해서 Environment Context생성
→ 선언문만 실행해서 Environment Record에 기록
실행: 선언문 외 나머지 코드 순차적 실행
→ Environment Record를 참조하거나 업데이트
함수를 변수에 담아서 선언하는 방식을 함수 표현식이라 하는데,
선언하는 방식이 변수와 같기 때문에 변수 호이스팅과 같은 방식으로 동작
study();
var study = ()=>{
// var는 생성단계에서 undefined로 초기화되고, undefined는 함수가 아니기 때문에
// type에러가 발생
}
---------------------------------------------------------------------------------------
study();
const study = ()=>{
// const는 생성단계에서 값이 할당되지 않기 때문에 reference error가 발생한다.
}
---------------------------------------------------------------------------------------
study();
function study(){
// 함수를 변수에 담지 않고 function로 선언하는 경우 자바스크립트 엔진이 완성된
// 함수 객체를 생성해서 환경레코드에 기록하기 때문에 함수가 정상적으로 실행된다.
}
식별자 결정 : Identifier Resolution
// 함수가 새로 생성되면 실행컨텍스트에 함수를 기록하고 바깥 렉시컬 환경으로 나갈 수 있는
// outer를 남겨놓는다. 이 outer를 이용해 이전 실행 컨텍스트의 환경레코드에 저장된 식별자도
// 참조할 수 잇다.
goTo2F()
let lamp = true;
function goTo3F(){
let pet = "puppy"
console.log(pet)
}
// 새로운 함수가 호출되었으니 또 다른 실행컨텍스트가 새로 생성되고 이전 렉시컬 환경을 가리키는 outer를 현재의 실행컨텍스트에 저장한다.
goTo3F()
변수 섀도잉 : 동일한 식별자로 인해 상위 스코프에서 선언된 식별자의 값이 가려지는 현상
위처럼 outer를 이용해 식별자를 결정할 때 활용하는 스코프들의 연결 리스트를 스코프 체인이라 한다.