✅ 실행 컨텍스트 객체의 실체(=담기는 정보)
- VariableEnvironment(VE : record & outer )
- 현재 컨텍스트 내의 식별자 정보(=record)를 갖고있어요.
- var a = 3
- 위의 경우, **var a**를 의미
- 외부 환경 정보(=outer)를 갖고있어요.
- 선언 시점 LexicalEnvironment의 snapshot
- 현재 컨텍스트 내의 식별자 정보(=record)를 갖고있어요.
- LexicalEnvironment(LE : 실시간 반영)**
- VariableEnvironment와 동일하지만, 변경사항을 실시간으로 반영해요.
- ThisBinding
- this 식별자가 바라봐야할 객체
- (2) VariableEnvironment, LexicalEnvironment의 개요
- VE vs LE
- VE : 스냅샷을 유지해요.
- LE : 스냅샷을 유지하지 않아요. 즉, 실시간으로 변경사항을 계속해서 반영합니다.
- 이 두가지는 담기는 항목은 완벽하게 동일해요. 그러나, 스냅샷 유지여부는 다음과 같이 달라요.
- 구성 요소(VE, LE 서로 같아요!)
- VE, LE모두 동일하며, ‘environmentRecord’와 ‘outerEnvironmentReference’로 구성
- environmentRecord(=record)
- 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장돼요.
- 함수에 지정된 매개변수 식별자, 함수자체, var로 선언된 변수 식별자 등
- outerEnvironmentReference(=outer)
- VE vs LE
✅ LexicalEnvironment(1) - environmentRocord(=record)와 호이스팅
- 개요
- 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장(수집)돼요. **기록된다**라고 이해해보면, **record**라는 말과 일맥상통하죠?
- 수집 대상 정보 : 함수에 지정된 매개변수 식별자, 함수 자체, var로 선언된 변수 식별자 등
- 컨텍스트 내부를 처음부터 끝까지 순서대로 훑어가며 수집
- 💡 순서대로 수집한다고 했지, 코드가 실행된다고 하지는 않았습니다!
✅ 호이스팅 (Hoist : 감아올리다)
변수정보 수집을 모두 마쳤더라도 아직 실행 컨텍스트가 관여할 코드는 실행 전의 상태에요(JS 엔진은 코드 실행 전 이미 모든 변수정보를 알고 있는 것)
변수 정보 수집 과정을 이해하기 쉽게 설명한 ‘가상 개념’
💡 가상개념이라는 말은, 실제로는 그렇진 않더라도 사람이 이해하기 쉬운 말로 풀어 표현했다는 것을 의미해요 😄
- 호이스팅 규칙
- 호이스팅 법칙 1 : 매개변수 및 변수는 선언부를 호이스팅 합니다.
<적용 전>
//action point 1 : 매개변수 다시 쓰기(JS 엔진은 똑같이 이해한다)
//action point 2 : 결과 예상하기
//action point 3 : hoisting 적용해본 후 결과를 다시 예상해보기
function a (x) {
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
<매개변수 적용>
//action point 1 : 매개변수 다시 쓰기(JS 엔진은 똑같이 이해한다)
//action point 2 : 결과 예상하기
//action point 3 : hoisting 적용해본 후 결과를 다시 예상해보기
function a () {
var x = 1;
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
<호이스팅 적용>
//action point 1 : 매개변수 다시 쓰기(JS 엔진은 똑같이 이해한다)
//action point 2 : 결과 예상하기
//action point 3 : hoisting 적용해본 후 결과를 다시 예상해보기
function a () {
var x;
var x;
var x;
x = 1;
console.log(x);
console.log(x);
x = 2;
console.log(x);
}
a(1);
자, 우리는 예상을
1 → undefined → 2로 예상했지만
실제로는
1, 1, 2 라는 결과가 나왔네요
호이스팅이라는 개념을 모르면 예측이 불가능한 어려운 결과입니다.
- 호이스팅 법칙 2 : 함수 선언은 전체를 호이스팅합니다. 마찬가지로, 2가지 action points에 따라 진행해봅시다.
<적용 전>
//action point 1 : 결과 값 예상해보기
//action point 2 : hoisting 적용해본 후 결과를 다시 예상해보기
function a () {
console.log(b);
var b = 'bbb';
console.log(b);
function b() { }
console.log(b);
}
a();
<호이스팅 적용>
//action point 1 : 결과 값 예상해보기
//action point 2 : hoisting 적용해본 후 결과를 다시 예상해보기
function a () {
var b; // 변수 선언부 호이스팅
function b() { } // 함수 선언은 전체를 호이스팅
console.log(b);
b = 'bbb'; // 변수의 할당부는 원래 자리에
console.log(b);
console.log(b);
}
a();
해석을 편하게 하기 위해서 함수선언문을 함수 표현식으로 바꿔볼게요!
//action point 1 : 결과 값 예상해보기
//action point 2 : hoisting 적용해본 후 결과를 다시 예상해보기
function a () {
var b; // 변수 선언부 호이스팅
var b = function b() { } // 함수 선언은 전체를 호이스팅
console.log(b);
b = 'bbb'; // 변수의 할당부는 원래 자리에
console.log(b);
console.log(b);
}
a();
이번에도 우리의 예상은 틀렸네요.
에러(또는 undefined), ‘bbb’, b함수
라고 나올 것 같았지만, 실제로는
b함수, ‘bbb’, ‘bbb’
라는 결과가 나왔어요. 이 또한 호이스팅을 고려하지 않고는 결과를 예측하기가 매우 어려웠어요. 호이스팅을 다루는 김에, 함수의 정의방식 3가지와 주의해야 할 내용을 살짝 짚고 넘어가 보도록 하겠습니다 😉
'Javascript' 카테고리의 다른 글
this 콜백함수 & 생성자 함수_v3.9 (1) | 2023.12.16 |
---|---|
함수선언문 < 함수표현식_v3.8 (0) | 2023.12.16 |
실행컨텍스트(스코프, 변수, 객체, 호이스팅)_v3.6 (0) | 2023.12.16 |
undefined vs null_v3.5 (0) | 2023.12.16 |
불변 객체 : 얕은복사vs깊은복사_v3.4 (0) | 2023.12.15 |