내일배움캠프 에서 자바스크립트 종합반 강의가 주어져 다 들었지만,
실행컨텍스트에 대해 전혀 이해가 가지 않아 답답했었다.
그러다 내배캠 내부에서 이론에 관한 특강이 있어 공부하게 되었는데,
정말 이해가 잘 되게 알려주셨다.
이해된 이 내용을 기록하기 위해 정리한다.
일단 실행컨텍스트에 대해 알기 전에,
메모리 공간과, 인터프리터, 컴파일러에 대해 알아야 한다.
🚗 메모리 공간
- 각 영역별로 구분되어 있고, 각 영역별로 역할이 다르다.
- 코드영역 __ 실행할 프로그램의 코드가 저장된다.
- 데이터 영역 __ 전역변수, 정적변수가 저장되는 공간.
- 힙 영역 __ 프로그래머가 할당 및 해제하는 메모리 공간
- 힙 영역 __ 런타임에 크기가 결정된다. (객체타입 - array, 클래스, obj 등등 저장된다.)
- 스택 영역 __ LIFO(last in first out) 방식이며, 가장 마지막에 들어온 것 부터 실행이 되며 값을 할당한다.
- 스택 영역 __ 프로그램이 자동으로 사용하는 임시 메모리 영역이다.
- 스택 영역 __ 함수 호출이 완료되면, 할당된 영역이 해제된다.
🚓 인터프리터
- 코드를 한줄 한줄 순서대로 읽어 나가며 기계어로 번역 및 실행한다.
- 코드를 실행하기 전 컴파일 단계가 없이 바로바로 처리하기 때문에, 실행 속도가 빠르다
- 그러나 코드가 많아질 수록 느려진다는 단점이 존재한다.
🚕 컴파일러
- 파일 전체를 처음부터 끝까지 다 읽은 후에, 컴파일 하여 기계어로 변환한다.
- 즉, 한번에 처리한다.
- 변환된 기계어는 cpu로 입력되어 코드가 실행된다
- 함수가 반복사용 될때에, 함수를 반복해서 실행하지 않고, 함수의 결과물을 반복한다. _ 작업이 단순화 된다.
🚙 V8 엔진
- 구글에서 최초로 개발했으며, 크롬에 적용되어 있는 자바스크립트 엔진이다.
- v8 엔진을 기반으로 Node.js 가 만들어 졌다.
- 기존의 자바스크립트 엔진은 인터프리터 방식을 사용했지만, 코드가 많아지면 느려졌다.
- 인터프리터 대신 JIT 컴파일러(just in time) 를 이용하여 모든 코드를 쭉 읽도록 만든것이 바로 V8엔진.
- 따라서 V8 엔진은 컴파일러 이자 인터프리터 이다.
- 모든 코드를 컴파일러 처럼 쭉 읽은 후, 인터프리터 언어처럼 한줄 씩 실행하기 때문이다.
🚎 실행 컨텍스트
식별자도 저장하고, 외부환경도 참조하며 코드가 실행되는 환경을 제공하는 객체
- 위에서부터 아래로 코드를 읽으며 함수를 만나게 되면, 해당 함수에 대한 실행 컨텍스트를 콜스텍에 쌓아둔다.
- JS 실행시 저절로 실행되는 전역 실행 컨텍스트가 존재하며, 그 위로 해당 함수에 따라 콜스텍에 실행컨텍스트를 쌓아둔다.
- 가장 위에 있는 실행 컨텍스트를 활성화된 실행 컨텍스트 라고 한다.
- 실행이 완료되게 되면 제거된다.
🚌 실행 컨텍스트 내부
여러가지가 존재하지만, 일단은 2가지로 기억하고 이해해 보자.
👉 Enviroment Record _ 환경 레코드
- 식별자와 바인딩 된 값을 저장한다.
👉 Outer Enviroment Reference _ 외부 환경 참조
- 상위 Lexical Environment(정적 환경)을 참조한다.
- 중첩된 자바스크립트 코드에서, 상위 요소의 스코프 탐색 및 식별자 탐색을 하는데 사용된다.
여기까지만 읽으면 이게 도대체 무슨말인가 싶다.
좀더 살펴보자.
🚜 호이스팅
선언이 되어있지 않는데도 불구하고, 선언이 최상단에 끌어올려져 있는 것처럼 보이는 현상.
자바스크립트의 코드 실행 순서를 살펴보면 호이스팅 이라는 개념과, 실행 컨텍스트에 대한 이해가 된다.
자바스크립트의 코드 실행 순서는 이렇다.
- 파일을 처음부터 끝까지 읽는다.
- 실행 컨텍스트 생성한다.
- 선언문만 실행하여, 메모리 공간 확보 후 Enviroment Record 에 기록한다.
- 이때 var 변수의 경우 선언 이전에 호출되면, 초기화 작업 진행 후 undefined라는 값을 바인딩 한다.
- let 이나 const 변수의 경우 선언 이전에 호출되면, 일시적 사각지대가 되며 Refference Error가 발생한다.
- 이후 값이 할당된다면, Enviroment Record 에 기록을 업데이트 하게 된다.
- 값 할당후 호출이 된다면, Enviroment Record 의 기록을 참조하여 내보낸다.
변수 뿐만 아니라 함수도 마찬가지다.
함수 선언식과 함수 표현식에 따라 약간 다른데,
✅ 함수 표현식
- 함수 안에 내용물을 저장하지 않는다는 특성이 있다.
- var 의 경우, 함수보다 위에서 호출하게 되면, undefined를 실행하려 했다고 인식하며, Type Error가 발생한다.
- let 이나 const 의 경우, 실행컨텍스트에서 선언문은 실행이 되지만, 초기화를 진행하지 않았기 때문에 참조값이 없다. Refference Error 가 발생한다.
✅ 함수 선언식
- 함수의 호출 위치가 함수보다 위에서 호출해도 함수 안에 내용물이 레코드에 저장된다.
- var, let, const 의 경우 모두 그렇다.
호이스팅까지 보고 나니 이제 실행컨텍스트가 어떤 역할을 하는지 좀 알 것 같다.
다음 게시글에는 스코프체이닝과, 클로저에 대해 알아보자!!
'TIL' 카테고리의 다른 글
23/10/31 TIL __ 모듈 타입에서 변수의 특징 (0) | 2023.10.31 |
---|---|
23/10/30 TIL _ 스코프 체이닝과 클로저 그리고 이벤트 루프 (1) | 2023.10.30 |
23/10/27 TIL _ nullish 병합 연산자 " ?? " (0) | 2023.10.27 |
23/10/26 TIL __ git stash (0) | 2023.10.26 |
22/10/25 TIL __ localstorage (1) | 2023.10.25 |