→ 코드를 실행할 때 식별자를 더욱 효율적으로 결정하기 위한 수단으로써, 필요한 정보를 한데 모아 제공하는 객체.
second() 함수의 상위스코프는 10
가장 바깥에서 호출한 second() 함수 는 함수 외부에서 호출했기 때문에 error
→ 전역(가장 바깥 영역)에서 선언된 변수와 함수. 어디서든지 사용할 수 있다.
→ 함수 내부에서 선언된 변수나 함수는 함수 내부에서만 유효하며, 함수 외부에서는 사용할 수 없다.
→ let, const 키워드로 선언된 변수는 블록 내부에서만 유효하며, 블록 외부에서는 사용할 수 없다.
type 이라는 블록 내부에서는 콘솔이 찍히지만 외부에선 error
Lexical environment
첫 번째 요소는 Environment Record로 해당 실행 컨텍스트에 선언되어 있는 변수, 함수들이 모여있는 요소이다.
함수가 실행될 때 함수에 선언되어 있는 변수, 함수들을 먼저 모아두기 때문에 호이스팅이 발생한다. (함수레벨 스코프)
Outer Environment Reference 외부환경 참조 - 외부 변수에 접근
const so = "소";
function foo1() {
const yoon = "윤";
console.log(x + so + yoon);
function foo3() {
const park = "박";
console.log(park + so + x);
}
foo3();
}
function foo2() {
const soyoon = "소윤";
console.log(so + soyoon);
}
foo1();
foo2();
만약, foo3 에서 so변수라는 같은이름의 변수를 선언한다면, 이미 Environment Record 에서 “쏘” 라는 값을 찾았기 때문에 상위 스코프로 올라가지 않고 멈춘다.
이처럼 동일한 식별자로 인해 상위 스코프에서 선언된 식별자의 값이 가려지는 현상을 변수섀도잉 이라고 한다.
→ 필요한 정보를 객체로 구성하여 이를 콜 스택에 쌓아올려, 가장 위에 쌓여있는 컨텍스트와 관련있는 코드들을 실행, 마지막으로 콜 스택에서 해당 컨텍스트를 pop하여 제거함, 변경 사항이 실시간으로 반영됨
Variable Environment
→ 선언 시점의 Lexical Environment 의 스냅샷. 변경 사항은 반영되지 않는다.
현재 컨텍스트 내의 식별자들에 대한 정보 . Variable Environment 에 먼저 정보를 저장 한 후 이를 복사해서 Lexical Environment 를 만듬.
코드를 실행하는데 필요한 환경을 제공하는 객체
라고 할 수 있다.