실행할 코드에 제공할 환경 정보들을 모아놓은 객체입니다.
선언된 변수를 위로 끌어올리기 (Hositing)
외부 환경 정보를 구성하기
this 값을 설정하기
👉 위와 같은 동작을 수행해요.
아래 그림을 통해 이해해 봅시다.
현재 접근할 수 있는 변수들의 범위를 말해요.
Scope Chain
라고 합니다.선언될 당시
의 Lexical Environment를 참조해요.😮💨 글만 읽으니 무슨 말인지 너무 어렵죠? 코드로 살펴볼까요?
var a = 1;
var outer = function () {
var inner = function() {
console.log(a);
var a = 2;
}
inner();
console.log(a);
}
outer();
console.log(a);
콘솔에 어떤 값들이 찍힐까요?
1. 전역 실행 컨텍스트
2. outer() 실행 시 outer 실행 컨텍스트
3. inner() 실행 시 현재 일시중단, inner 실행 컨텍스트
4. console.log(a)는 var a가 호이스팅 되었기 때문에 undefined (아직 a=2 할당은 안되었어요.)
5. inner()에서 빠져나오면 다시 outer 실행 컨텍스트
6. console.log(a)는 var a = 1; 이므로 1
7. outer()에서 빠져나오면 전역 실행 컨텍스트이므로 1
맞아요. Scope Chain에서 참조하는 것이 Lexical Environment의 outer Environment Reference
입니다.
함수 표현식이 함수 선언문보다 일반적으로 안전합니다.
함수 선언문은 호이스팅으로 인해 어느 곳에 있어도 실행이 가능합니다. 따라서, 의도하지 않은 곳에서 함수 선언문을 사용하게 되면 코드 전 범위에 걸쳐 영향을 미치게 됩니다.