Javscript
엔진은 스크립트 파일을 스캔할 때 코드의 전체 변환 및 실행을 처리하는 실행컨텍스트라는 하나의 환경을 생성한다.
컨텍스트 실행동안 컴파일러는 소스 코드를 구문분석하고, 변수 및 함수에 대한 메모리를 할당하고, 소스 코드가 생성되고 실행된다.
실행 컨텍스트는 실행할 코드에 제공할 환경 정보들을 모아 놓은 객체이다.
실행컨텍스트는 전역 실행 컨텍스트, 함수 실행 컨텍스트 두가지 유형이 존재
전역 실행 컨텍스트
Javascript
의 스크립트가 처음 실행될때 생성되며,Javscript
에서의 전역 범위를 나타낸다.함수 실행 컨텍스트
자바스크립트에서의 실행 컨텍스트는 두단계를 거친다
생성 단계 : Javascript
엔진은 실행 컨텍스트를 생성하고, 스크립트의 환경을 설정한다. 그리고 변수 및 함수의 값을 결정하고, 실행 컨텍스트에 대한 스코프 체인을 설정한다
실행 단계 : Javascript
엔진은 실행 컨텍스트에서 코드를 실행하고, 스크립트의 모든 문 또는 식을 처리하고 모든 함수 호출에 대한 평가가 진행된다.
Javascript에서의 실행컨텍스트 실행단계
🌇 코드로 실행 컨텍스트의 실행 단계 이해해보기
- 실행컨텍스트의 생성단계는 실행 컨텍스트의 준비
- 실행컨텍스트의 실행단계는 생성단계에서 준비된 코드를 실행하는 과정
아래와 같은 코드가 있을때, 실행 단계 흐름을 분석해보자
var n = 5;
function square(n) {
var ans = n * n;
return ans;
}
var square1 = square(n);
var square2 = square(8);
console.log(square1)
console.log(square2)
해당 코드에서의 전역 실행 컨텍스트의 생성 단계
전역실행 컨텍스트는 브라우저에서는 window
, node 환경에서는 global
이라는활성 객체를 생성
❓ 여기서 활성객체란
전역실행 컨텍스트
전역 범위에서 선언된 전역범수와 함수, 그리고 전역객체(window,global
)에 대한 참조를 포함한다.
함수실행 컨텍스트
해당 함수의 스코프에 기반하여 생성되며, 함수 내부에서 선언된 변수와 함수, 매개변수,this
값등을 저장한다.
변수와 함수를 선언 및 초기화
undefiend
로 초기화 한다this
값 설정
스코프 체인 설정
해당 코드에서의 전역 실행 컨텍스트의 실행 단계
var n
)은 해당 값(5
)를 할당받는다.🌅 위의 설명에서 전역실행컨텍스트가 함수 실행 컨텍스트를 만났을때 함수 실행 컨텍스트의 생성과 실행 단계
함수 실행 컨텍스트의 생성 단계
square
의 실행 컨텍스트가 생성되면, 해당 스코프 체인에 기반한 활성 객체인 함수 스코프의 활성객체가 생성된다n
과 ans
가 함수의 활성객체에 등록된다.함수 실행 컨텍스트의 실행 단계
var ans = n * n
에서 n 변수의 값이 인자로 전달된 값으로 초기화되며, ans 변수의 계산 결과인 25가 할당된다return
에 의해 ans 변수의 값인 25가 반환되고 함수 실행 컨텍스트가 종료되고 소멸된 후에 다시 기존의 전역 실행 컨텍스트의 실행단계가 다시 시작된다.🕌 함수 실행 컨텍스트가 종료되고, 다시 전역 실행 컨텍스트로 돌아가서 남아있던 전역 실행 컨텍스트를 실행되는 과정
변수 할당
var square1 = square(n);
구문에서 square
함수 호출 결과인 25
가 square1
변수에 할당코드 실행
- var square2 = square(8);
를 만나 다시 또 위와 같이 함수 실행컨텍스트가 생성 되고 실행되며 반환된 값이 square2
변수에 할당되고,
최종적으로 console.log(square1) console.log(square2)
에 대한 출력값이 출력된다.
전역실행 컨텍스트와 함수실행 컨텍스트는 엄연한 차이점이 존재한다.
활성 객체
전역실행 컨텍스트는 전역 범위에서 선언된 전역범수와 함수, 그리고 전역객체(window,global)에 대한 참조
함수실행 컨텍스트는 해당 함수의 스코프에 기반하여 생성되며, 함수 내부에서 선언된 변수와 함수, 매개변수, this값등을 저장
호출 시점과 동작
전역실행 컨텍스트는 스크립트가 실행될때 생성되며, 코드의 실행이 끝까지 완료될때까지 유지된다
함수실행 컨텍스트는 함수가 호출될때 생성되며, 함수의 실행이 완료되면 소멸한다. 함수를 호출할때마다 그 함수의 새로운 함수 실행 컨텍스트가 생성되므로, 서로 다른 함수 호출은 각각 독립된 함수 실행 컨텍스트를 생성하고 실행한다.
Javascript
는 전역 실행 컨텍스트 및 함수 실행 컨텍스트를 추적하기 위해 호출스택을 사용한다.
해당 호출스택은 실행 컨텍스트 스택, 런타임 스택이라고 부른다.
자바스크립트의 실행 컨텍스트 스택은 LIFO
원칙을 사용한다.
엔진이 스크립트 실행을 처음 시작할때, 전역 컨택스트를 생성하고 스택에 push
한다.
마찬가지로 함수가 호출될때마다 해당 함수에 대한 함수 실행 컨텍스트를 생성하고 이를 호출 스택의 맨위로 푸쉬하고 실행을 시작한다.
함수의 실행이 끝나면, 가장 마지막에 실행되었던 함수 실행 컨텍스트를 호출 스택에서 가장 먼저 제거 한다
이런 방법을 계속 반복하며, 가장 늦게 들어온 순으로 실행 컨텍스트들을 pop
한다
Javscript에서의 호출스택(LIFO)
Javascript
에서의 실행 컨텍스트는 Javascript
엔진이 작동하는 방식을 이해하는데 중요하다.
실행컨텍스트는 코드가 실행되는 환경을 제공하고, 사용할 수 있는 변수 및 함수를 결정한다.
생성단계에선 전역 및 함수 실행 컨텍스트의 생성, 스코프체인 생성, 변수 및 함수에 대한 메모리 할당이 되고
실행단계에선 엔진이 코드를 한줄 씩 실행하게 된다.
둘은 엄연히 다른 역할을 수행하고 있으니 더이상 혼동하는일이 없기를..👋👋
잘 봤습니다. 좋은 글 감사합니다.