실행 컨텍스트
: 코드를 실행하기 위해 필요한 스코프, 식별자, 실행 순서 등을 관리를 구현한 내부 메커니즘, 모든 코드는 실행 컨텍스트에 의해 실행되고 관리된다.
자바스크립트 엔진은 소스코드를 2개의 과정, 소스코드의 평가
와 소스코드의 실행
으로 나누어 처리한다
평가 과정
실행 과정
코드 실행 순서
는 실행 컨텍스트 스택
으로 관리
식별자
와 스코프
는 실행 컨텍스트의 렉시컬 환경
으로 관리
실행 컨텍스트 스택
렉시컬 환경
환경 레코드
와 외부 렉시컬 환경에 대한 참조
로 이루어진다환경 레코드
: 스코프에 포함된 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소외부 렉시컬 환경에 대한 참조
: 상위 스코프를 가리킴 -> 스코프 체인 구현let,const 키워드로 선언된 변수는 블록 레벨 스코프를 따른다.
예를 들어, if문 같은 코드 블록이 실행되면, 코드 블록을 위한 블록레벨 스코프를 생성해야한다.
이때 렉시컬 환경을 새로 생성하여 전역 렉시컬 환경을 교체한다. 외부 렉시컬 환경에 대한 참조를 전역 렉시컬 환경을 가리키게 한다. if문이 끝나면, 이전의 전역 렉시컬 환경으로 돌아온다. for문의 변수 선언문에 let 키워드를 사용하면, 코드 블록이 반복될 때마다 코드 블록을 위한 새로운 렉시컬 환경을 생성한다.
자바스크립트는 렉시컬 스코프
를 따른다!
렉시컬 스코프
: 함수를 어디서 선언했는지에 따라 상위 스코프가 결정된다
렉시컬 스코프를 따르기 때문에 함수는 자신이 어디서 정의되었는지 기억해야 하고, 상위 스코프의 참조를 자신의 내부 슬롯 [[Environment]]에 저장한다. 이는 현재 실행 중인 실행 컨텍스트의 렉시컬 환경을 가리킨다.
클로저
: 외부 함수보다 중첩 함수가 더 오래 유지되는 경우, 이미 생명 주기가 종료된 외부 함수의 변수를 참조할 수 있다. -> 이 중첩 함수를 클로저
라 한다.
함수가 기억하는 상위 스코프는 어디서 호출하든 항상 유지된다!
-> 함수는 언제나 자신이 기억하는 상위 스코프의 식별자를 참조할 수 있다. 식별자에 바인딩된 값을 변경할 수도 있다!
클로저는 상태를 안전하게 변경하고 유지하기 위해 사용한다! 상태를 안전하게 은닉하고, 특정 함수에게만 상태 변경을 허용한다!