✔️ Closure?
함수가 선언(생성)될 때
주변 환경(Lexical Environment)과 함께 갇히는 것
++ 지속적으로
그 변화를 추적하는 것(Live Reference)
✔️ 실행 컨텍스트? 함수가 실행될 때
실행할 코드에 제공할 환경 정보들을 모아놓은 객체
// (1) 전역 컨텍스트
let a = 1;
function first() {
function second() {
console.log(a);
let a = 3;
}
second(); // (3)
console.log(a);
}
first(); // (2)
console.log(a);
/* 위 코드 실행하면
(1)전역 컨텍스트, (2)first 실행 컨텍스트, (3)second 실행 컨텍스트 순으로 콜스택에 담김
실행은 (3) => (2) => (1) 순으로 실행하고 콜스택에서 제거됨 */
스택
큐
✔️ VariableEnvironment?
LexicalEnvironment의 최초 실행(선언 시점) 스냅샷을 유지
environmentRecord + outer-EnvironmentReference
✔️ LexicalEnvironment?
현재 컨텍스트 내부의 식별자, 참조하는 외부 정보 등 컨텍스트를 구성하는 환경 정보를 모아놓은 것
environmentRecord + outer-EnvironmentReference
✔️ environmentRecord에는 현재 컨텍스트와 관련된 코드의 식별자 정보들이 저장
✔️ 호이스팅?
변수 선언문이 스코프 내에서 최상단으로 끌어올려지는 것 → 할당 과정은 남아있음
// 함수 선언문 -> 전체 호이스팅
console.log(add(3, 4)); // 7
function add(a, b) {
return a + b;
}
console.log(add(3, 4)); // 7
// 함수 표현식 -> 변수 선언부만 호이스팅
console.log(multiply(3, 5)); // "ReferenceError: Cannot access 'multiply' before initialization
let multiply = function(a, b) {
return a * b;
};
console.log(multiply(3,5)); // 15
// 상대적으로 함수 표현식이 안전 (함수 선언문의 경우 동일한 함수명 여러번 나올 경우 최신으로 덮어씌움)
✔️ 스코프? 변수에 대한 유효범위
✔️ 스코프 체인? 안에서부터 바깥으로 차례로 검색해나가는 것
let a = 1;
let outer = function () {
let inner = function () {
console.log(a);
let a = 2;
};
inner();
console.log(a);
};
outer();
console.log(a);
// 스코프 체인: inner -> outer -> global
// 전역 변수: 전역에서 생성한 변수
// outer: 전역 변수에 접근 가능, inner로는 접근 불가능
// inner: 전역과 outer로 접근 가능,inner 스코프 외부에서 접근 불가능
/* 변수 은닉화?
만약 여러 스코프에서 동일한 식별자를 선언한 경우, 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 */
전역 변수
전역 스코프에서 선언한 변수
지역 변수
전역 스코프 아닌 곳에서 선언한 변수
⚠️ 코드의 안정성을 위해 가급적 전역변수 사용은 최소화
실행컨텍스트의 thisBinding → 실행 컨텍스트를 활성화할 당시에 지정된 this 객체 저장
this가 지정되지 않은 경우 → this에 전역 객체 저장
이해가 쏙쏙 되는군요!! 퍼가요~~