아래의 예제 코드를 보면 실행 컨텍스트가 어떤 순서로 쌓이고, 어떤 순서로 실행에 관여하는지 확인 해보겠다.
function outer() {
function inner() {
return 'inner 함수';
}
inner(); // inner 함수 컨텍스트
}
outer(); // outer 함수 컨텍스트
outer
관련 환경 정보를 수집해서 outer
실행 컨텍스트를 생성한 뒤에 콜스택에 담는다.outer
함수 내부의 코드를 실행하다가 함수 내부에서 inner() 함수를 호출하면 outer
함수 실행 컨텍스트를 중단하고 생성된 inner
실행 컨텍스트를 실행한다. VariableEnvironment
: 변수 객체(Variable Object)LexicalEnvironment
Environment Record
hoisting
Outer
ThisBinding
호이스팅(Hoisting)은 변수의 선언, 함수의 선언이 모두 끌어올려져 유효 범위 내의 최상단에 선언하는것을 말한다.
변수의 키워드 let, const는 실행되기 전까지 사용할 수 없다. 이 단계의 공간을 TDZ 라고한다.
function a(x) {
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
{}
등과 같은 범위를 가진다.{}
문에서 사용하면 전역 스코프를 가진다.if (true) {
var x = 5;
}
console.log(x); // 5
변수가 해당 스코프에 존재하지 않을 때 바깥으로 차례로 검색하는 것을 스코프 체인(Scope) 이라고 한다.
클로저(Closure) 함수를 선언할 때 만들어진 스코프가 사라진 후에도 호출할 수 있는 함수 즉, 스코프가 끝난 외부 함수의 변수를 참조할 수 있다.