poiemaweb 22강 복습
실행컨텍스트
실행 가능한 코드를 4가지 유형으로 구분
전역 코드
함수 코드
eval 코드
모듈 코드
실행에 앞서 평가 과정을 거치면서 코드 실행을 위한 준비를 한다.
코드 평가 과정에서 실행컨텍스트가 생성되고 변수 함수 클래스 등의 선언문이 평가되어 그 결과가 생성된 실행 컨텍스트에 등록된다.
평가 과정이 끝나면 선언문을 제외한 코드가 순차적으로 실행된다.
이때 코드 실행에 필요한 정보를 실행컨텍스트에서 취득한다.
코드의 실행결과는 실행 컨텍스트에서 관리된다.
// 전역 변수 선언
const x = 1;
const y = 2;
// 함수 정의
function foo(a) {
// 지역 변수 선언
const x = 10;
const y = 20;
// 메소드 호출
console.log(a + x + y); // 130
}
// 함수 호출
foo(100);
// 메소드 호출
console.log(x + y); // 3
위 코드의 자바스크립트 엔진이 수행 하는 과정
1. 전역 코드 평가
변수 선언문과 함수 선언문이 평가되고 그 결과 전역변수와 전역함수는 전역 스코프에 등록
var키워드로 선언된 전역변수로 함수 선언문으로 정의된 전역 함수는 전역 객체의 프로퍼티가 된다.
2. 전역 코드 실행
전역 코드가 실행되어 전역 변수에 값이 할당되고 함수가 호출된다.
함수가 호출되면 순차적으로 실행되던 전역 코드의 실행을 일시 중단하고 코드 실행 순서를 변경하여 함수 내부로 진입
3. 함수 코드 평가
함수 내부 진입하여 함수 코드가 평가된다.
매개변수와 지역변수 선언문이 평가되고 그 결과, 매개 변수와 지역변수는 지역 스코프에 등록된다.
함수 내부에서 지역변수처럼 사용할 수 있는 arguments 객체도 생성되어 지역 스코프에 등록된다.
4. 함수 코드 실행
함수 코드가 실행되어 매개변수와 지역 변수에 값이 할당되고 console.log 메소드가 호출
실행 컨텍스트는 실행 가능한 코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
실행 컨텍스트 스택 = 콜 스택
코드의 실행 순서를 관리한다.
콜 스택의 최상위에 존재하는 실행 컨텍스트는 언제나 현재 실행중인 코드의 실행컨텍스트이다. = 실행 컨텍스트
자바스크립트는 싱글 스레드로 동작한다.
하나의 처리가 종료되어야 다음 처리를 실행 할 수 있는 것을 동기식 처리 모델
자바스크립트는 비동기식 처리 모델을 지원한다.
렉시컬 환경
식별자가 선언되는 환경이며 스코프와 식별자를 관리한다.
객체형태의 스코프를 만들고 이곳에 식별자를 등록한다. 등록된 식별자에 바인딩 된 값을 관리한다.
소스코드가 로드되면 전역 코드를 평가
1. 전역 실행 컨텍스트 생성
실행 컨텍스트 스택에 전역 실행 컨텍스트를 푸시
2. 전역 렉시컬 환경 생성
2.1 전역 환경 레코드 생성
2.1.1 객체 환경 레코드 생성
var 키워드로 선언된 전역 변수와 함수 선언문으로 정의된 전역 함수는 객체 환경 레코드에 등록되고 관리
선언단게와 초기화단계가 동시에 진행
암묵적으로 undefined를 바인딩
함수 선언문으로 정의한 함수가 평가되면 함수 이름과 동일한 이름의 식별자를 객체 환경 레코드에 등록하고 생성된 함수 객체를 즉시 할당
2.1.2 선언적 환경 레코드 생성
let, const 키워드로 선언된 전역 변수(let, const 키워드로 선언한 변수에 할당한 함수 표현식 포함)는 선언적 환경 레코드에 등록되고 관리
var 키워드로 선언된 전역 변수는 전역 객체의 프로퍼티가 된다. 하지만 let, const 키워드로 선언한 전역 변수는 전역 객체의 프로퍼티가 되지 않고 전역 렉시컬 환경의 선언적 환경 레코드에 별도 관리
2.2 외부 렉시컬 환경에 대한 참조 할당
외부 렉시컬 환경에 대한 참조는 현재 평가 중인 코드를 포함하는 외부 코드의 렉시컬 환경을 가리킨다. 이를 통해 스코프 체인을 구현
2.3 this바인딩
전역 환경 레코드의 this에는 전역 객체가 바인딩
**식별자를 검색할 때는 실행 중인 실행 컨텍스트의 렉시컬 환경에서 식별자를 검색
1. 함수 실행 컨텍스트 생성
2. 함수 렉시컬 환경 생성
2.1. 함수 환경 레코드 생성
2.2 외부 렉시컬 환경에 대한 참조 할당
2.3 this 바인딩