동일 환경에 있는 코드를 실행할 때 필요한 환경 정보들을 모아 컨텍스트를 구성하고 이것을 위에서 설명드린 ‘스택’의 한 종류인 콜스택에 쌓아올린다
가장 위에 쌓여있는 컨텍스트와 관련된 코드를 실행하는 방법으로 코드의 환경 및 순서를 보장할 수 있다
컨텍스트의 구성
구성 방법
a. 전역공간
b. eval() 함수
c. 함수 (우리가 흔히 실행컨텍스트를 구성하는 방법)
실행컨텍스트 구성 예시 코드
// ---- 1번
var a = 1;
function outer() {
function inner() {
console.log(a); //undefined
var a = 3;
}
inner(); // ---- 2번
console.log(a);
}
outer(); // ---- 3번
console.log(a);
실행컨텍스트 구성 순서
코드실행 → 전역(in) → 전역(중단) + outer(in) → outer(중단) + inner(in) → inner(out) + outer(재개) → outer(out) + 전역(재개) → 전역(out) → 코드종료
실행 컨텍스트 객체의 실체(=담기는 정보)
a. VariableEnvironment
b. LexicalEnvironment
c. ThisBinding
개요
호이스팅
호이스팅 규칙
매개변수 및 변수는 선언부를 호이스팅 한다
<적용 전>
function a (x) {
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
<호이스팅 적용>
function a () {
var x;
var x;
var x;
x = 1;
console.log(x);
console.log(x);
x = 2;
console.log(x);
}
a(1);
함수 선언은 전체를 호이스팅
<적용 전>
function a () {
console.log(b);
var b = 'bbb';
console.log(b);
function b() { }
console.log(b);
}
a();
<적용 후>
function a () {
var b; // 변수 선언부 호이스팅
function b() { } // 함수 선언은 전체를 호이스팅
console.log(b);
b = 'bbb'; // 변수의 할당부는 원래 자리에
console.log(b);
console.log(b);
}
a();
함수 선언문, 함수 표현식
// 함수 선언문은 전체를 hoisting
function sum (a, b) { // 함수 선언문 sum
return a + b;
}
// 변수는 선언부만 hoisting
var multiply;
console.log(sum(1, 2));
console.log(multiply(3, 4));
//
multiply = function (a, b) { // 변수의 할당부는 원래 자리
return a + b;
};
식별자에 대한 유효범위
ES5까지 함수 스코프만 존재 (함수에 의해서 생성)
ES6부터 블록 스코프도 존재
식별자의 유효범위를 안에서부터 바깥으로 차례로 검색해나가는 것
var a = 1;
var outer = function() {
var inner = function() {
console.log(a); // undefined, inner 함수의 var a; 참조
var a = 3;
};
inner();
console.log(a); // 1, 전역에 있는 var a=1 참조
};
outer();
console.log(a); // 1