실행 컨텍스트와 클로저

김시환·2023년 3월 28일
0

javascript

목록 보기
1/4

실행 컨텍스트

실행 컨텍스트 : 코드를 실행하기 위해 필요한 스코프, 식별자, 실행 순서 등을 관리를 구현한 내부 메커니즘, 모든 코드는 실행 컨텍스트에 의해 실행되고 관리된다.

소스코드의 평가와 실행

자바스크립트 엔진은 소스코드를 2개의 과정, 소스코드의 평가소스코드의 실행으로 나누어 처리한다

  • 평가 과정
    - 실행 컨텍스트 생성
    - 변수, 함수 등의 선언문 먼저 실행
    - 식별자를 키로 실행컨텍스트가 관리하는 스코프에 등록함
  • 실행 과정
    - 평가 이후 실행
    - 소스코드 실행에 필요한 변수나 함수의 참조를 실행 컨텍스트가 관리하는 스코프에서 검색
    - 소스코드의 실행 결과는 다시 실행 컨텍스트가 관리하는 스코프에 등록됨 ex) 변수 재할당

코드 실행 순서실행 컨텍스트 스택으로 관리
식별자스코프실행 컨텍스트의 렉시컬 환경으로 관리

실행 컨텍스트 스택

  • 코드의 실행 순서를 관리
  • 소스코드가 평가되면 실행 컨텍스트가 생성되고 실행 컨텍스트 스택 최상위에 들어간다
  • 실행 컨텍스트 스택의 최상위에 있는 실행 컨텍스트는 언제나 현재 실행 중인 코드의 실행 컨텍스트다

렉시컬 환경

  • 스코프와 식별자를 관리
  • 환경 레코드외부 렉시컬 환경에 대한 참조로 이루어진다
  • 환경 레코드 : 스코프에 포함된 식별자를 등록하고 등록된 식별자에 바인딩된 값을 관리하는 저장소
  • 외부 렉시컬 환경에 대한 참조 : 상위 스코프를 가리킴 -> 스코프 체인 구현

실행 컨텍스트와 블록 레벨 스코프

let,const 키워드로 선언된 변수는 블록 레벨 스코프를 따른다.
예를 들어, if문 같은 코드 블록이 실행되면, 코드 블록을 위한 블록레벨 스코프를 생성해야한다.
이때 렉시컬 환경을 새로 생성하여 전역 렉시컬 환경을 교체한다. 외부 렉시컬 환경에 대한 참조를 전역 렉시컬 환경을 가리키게 한다. if문이 끝나면, 이전의 전역 렉시컬 환경으로 돌아온다. for문의 변수 선언문에 let 키워드를 사용하면, 코드 블록이 반복될 때마다 코드 블록을 위한 새로운 렉시컬 환경을 생성한다.

클로저

자바스크립트는 렉시컬 스코프를 따른다!
렉시컬 스코프 : 함수를 어디서 선언했는지에 따라 상위 스코프가 결정된다
렉시컬 스코프를 따르기 때문에 함수는 자신이 어디서 정의되었는지 기억해야 하고, 상위 스코프의 참조를 자신의 내부 슬롯 [[Environment]]에 저장한다. 이는 현재 실행 중인 실행 컨텍스트의 렉시컬 환경을 가리킨다.

클로저 : 외부 함수보다 중첩 함수가 더 오래 유지되는 경우, 이미 생명 주기가 종료된 외부 함수의 변수를 참조할 수 있다. -> 이 중첩 함수를 클로저라 한다.

함수가 기억하는 상위 스코프는 어디서 호출하든 항상 유지된다!
-> 함수는 언제나 자신이 기억하는 상위 스코프의 식별자를 참조할 수 있다. 식별자에 바인딩된 값을 변경할 수도 있다!

클로저의 활용

클로저는 상태를 안전하게 변경하고 유지하기 위해 사용한다! 상태를 안전하게 은닉하고, 특정 함수에게만 상태 변경을 허용한다!

profile
1년차 개발자입니다.

0개의 댓글

관련 채용 정보