2. 실행 컨텍스트

jihyun·2021년 8월 10일
0

코어자바스크립트

목록 보기
2/6
post-thumbnail

2-1 실행 컨텍스트란?

✔️ Closure?
함수가 선언(생성)될 때 주변 환경(Lexical Environment)과 함께 갇히는 것
++ 지속적으로 그 변화를 추적하는 것(Live Reference)

✔️ 실행 컨텍스트? 함수가 실행될 때 실행할 코드에 제공할 환경 정보들을 모아놓은 객체

  1. 변수객체
    • 변수
    • 매개변수(parameter)와 인수 정보(arguments)
    • 함수 선언(함수 표현식은 제외)
  2. 스코프
  3. this
// (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) 순으로 실행하고 콜스택에서 제거됨 */
  • 스택과 큐
    스택
    나중에 들어간 데이터가 먼저 나옴 (LIFO)

    처음 들어간 데이터가 먼저 나옴 (FIFO)
  • Garbage Collection
    자바스크립트 엔진이 내부적으로 사용하는 메모리 관리 시스템
    사용하지 않는 값들에 대한 메모리 영역을 주기적으로 정리하고 불필요한 메모리 사용이 없도록 관리
    클로저는 지속적으로 추적 필요하여 Garbage Collection에 의해 정리되지 않음 ⇒ 성능, 메모리 이슈

2-2 VariableEnvironment

✔️ VariableEnvironment?

LexicalEnvironment의 최초 실행(선언 시점) 스냅샷을 유지

environmentRecord + outer-EnvironmentReference

2-3 LexicalEnvironment

✔️ LexicalEnvironment?

현재 컨텍스트 내부의 식별자, 참조하는 외부 정보 등 컨텍스트를 구성하는 환경 정보를 모아놓은 것

environmentRecord + outer-EnvironmentReference

2-3-1 environmentRecord와 호이스팅

✔️ 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

// 상대적으로 함수 표현식이 안전 (함수 선언문의 경우 동일한 함수명 여러번 나올 경우 최신으로 덮어씌움)

2-3-2 스코프, 스코프 체인

✔️ 스코프? 변수에 대한 유효범위

✔️ 스코프 체인? 안에서부터 바깥으로 차례로 검색해나가는 것

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 스코프 외부에서 접근 불가능

/* 변수 은닉화?
만약 여러 스코프에서 동일한 식별자를 선언한 경우, 스코프 체인 상에서 가장 먼저 발견된 식별자에만 접근 */

전역 변수
전역 스코프에서 선언한 변수

지역 변수
전역 스코프 아닌 곳에서 선언한 변수

⚠️ 코드의 안정성을 위해 가급적 전역변수 사용은 최소화

2-4 this

실행컨텍스트의 thisBinding → 실행 컨텍스트를 활성화할 당시에 지정된 this 객체 저장

this가 지정되지 않은 경우 → this에 전역 객체 저장

2개의 댓글

comment-user-thumbnail
2021년 8월 10일

이해가 쏙쏙 되는군요!! 퍼가요~~

1개의 답글