min

Execution Context (+ hoisting , scope) 본문

자바스크립트

Execution Context (+ hoisting , scope)

minprogramming 2023. 12. 12. 09:18

1. 실행 컨텍스트의 정의

  실행 컨텍스트를 한 문장으로 표현하자면 "실행과 관련된 요소들의 집합"이라고 볼 수 있다. 그럼 여기서 이런 의문이 들 수 있다.

"그렇다면 실행과 관련된 정보들은 어떤 것들이 있는데?". 그래서 챕터 2에서는 실행 컨텍스트의 구성 요소에 대해서 알아볼려고 한다.

 

2. 실행 컨텍스트의 구성 요소

  • variable environment : variable environment는 크게 2가지로 이루어져 있다. 첫번째는 record로 "식별자" (변수 , 함수 , 클래스 등의 이름) 에 대한 정보가 담겨 있다. 두번째는 outer로 자기 자신보다 상위에 있는 실행컨텍스트의 lexical environment가 들어 있다. 
  • lexical environment : lexical environment는 variable environment의 snapshot이다. 다만 variable environment가 다른 점은 variable environment는 정적으로 한번 만들어지면 변하지 않는 성질이 있는 반면에 lexical environment는 동적으로 상태를 업데이트 할 수 있다는 성질을 가지고 있다.
  • this binding : this binding에 대해서는 차후에 소개하도록 하겠다.

 

3. 실행 컨텍스트의 사용성

  • hoisting : 실행 컨텍스트의 경우에는 호이스팅이라는 개념을 설명할 때도 들어간다. 많은 사람들이 호이스팅에 대해서 다음과 같이 생각하는 경우가 많다. "변수와 같은 식별자들이 런타임 이전에 코드의 가장 앞으로 배치된다." 하지만 이는 정확한 답변이 아니다. 식별자의 호이스팅은 다음과 같다. 코드가 실행되기 전 , 즉 런타임 이전에 실행 컨텍스트 스택에 실행 컨텍스트가 만들어진다. 여기서 variable environment , lexical environment에 식별자에 대한 정보가 들어가며 이 정보를 코드가 참조할 수 있게 되는 것이다. 즉 "런타임 이전에 식별자에 대한 정보가 물리적 실체에 들어가게 되는 것이다."  그리고 우린 이 과정을 쉽게 설명하기 위해서 앞선 설명이 나오는 것이다.
  • scope : 여러 프로그래밍 언어는 크게 2가지의 스코프를 지향한다. 첫번째는 동적 스코프이고 두번째는 렉시컬 스코프이다. 이 두 종류 스코프의 차이점은 함수와 같은 블록을 "호출"하느냐 , "선언"하느냐의 차이다. 여기서 자바스크립트는 렉시컬 스코프를 지향한다. 즉 함수와 같은 블록이 선언된 시점에서 실행컨텍스트를 만들고 outer를 통해서 자신보다 상위에 있는 식별자를 참조하는 방향인 것이다.

 

4. 실행 컨텍스트의 물리적 실체

: 실행 컨텍스트는 가상의 개념이 아니다. 실행 컨텍스트는 명확한 물리적 실체가 존재한다. 정확하게 말하면 실행컨텍스트를 담고 있는 실행컨텍스트 스택이 존재한다. 이 실행컨텍스트 스택의 생김새를 보면 다음과 같다.

여기서 볼 수 있듯이 스택 자료 구조를 통해서 함수가 호출될때 실행컨텍스트를 만든다. 여기서 집고 넘어가야할 점은 앞서 설명한 부분에서는 런타임이전에 실행 컨텍스트가 만들어진다고 했는데 왜 함수가 호출될 때 실행컨텍스트가 만들어진다고 한 걸까? 정확하게 말하면 함수를 호출하기 전에 함수에 대한 평가가 이루어진다. 즉 런타임 이전에 함수에 대한 실행컨텍스트를 만들고 함수가 호출되면 이 실행컨텍스트를 바탕으로 함수를 처리하는 것이다. 

 

참고자료

모던 자바스크립트