실행할 코드에 제공할 환경정보들을 모아 놓은 객체
실행컨텍스트를 구성하는 방법은 함수를 실행하는 것
출입구가 하나뿐인 우물같은 데이터 구조
양쪽이 모두 열려있는 파이프
우선순위가 중요한 작업들(ex. 프린트 인쇄)
실행 컨텍스트 생성 시,
1. VariableEnvironment에 정보를 먼저 담는다
2. 그대로 복사해서 LexicalEnvironment를 만든다
3. 이후 주로 LexicalEnvironment를 활용한다
호이스팅 : 식별자들은 최상단으로 끌어올리는 것
LexicalEnvironment - environmentRecord에 현재 컨택스트와 관련된 코드의 식별자 정보들이 저
장됨
저장 시 현재 실행 컨텍스트 내에 어떤 식별자들이 있는지에만 관심이 있음. 각 식별자에 어떤값이 할당될 것인지는 관심이 없음
즉, 변수를 호이스팅할 때 변수명만 끌어올리고 할당 과정은 원래 자리에 그대로 남겨 둠
=> 함수 선언문과 함수 표현식 개념과 함께 이해해야함 => 함수 표현식을 지향해야하는 이유!
function a () {/* ... */}
a();
const b = function c () {/* ... */}
c();
원본코드: 함수 선언문과 함수 표현식 & 호이스팅
console.log(sum(1, 2)); console.log(multiply(3, 4)); // 함수 선언문 sum function sum (a,b) { return a + b; }; // 함수 표현식 multiply const multiply = function(a, b) { return a + b; };
호이스팅 마친 상태 코드
// 함수 선언문은 함수 전체를 호이스팅 함 const sum = function sum (a,b) { return a + b; }; // 함수 표현식은 변수 선언부만 호이스팅 함 const multiply; // console.log(sum(1, 2)); console.log(multiply(3, 4)); // 변수의 할당부는 원래 자리에 그대로 multiply = function(a, b) { return a + b; }
코드가 몇 천줄인 경우,
전역 공간에 같은 이름의 여러 함수가 존재하는 상황이 생기더라도,
함수 전체가 호이스팅(함수 선언문)되지 않고 함수 변수만 호이스팅(함수 표현문)되는 것이 코드의 안전성을 높이는 방법임
안전한 코드 구성을 위해 전역변수의 사용은 최소화 하는 것이 좋음!