자바스크립트에서 실행 컨텍스트(execution context)와 스코프(scope)는 모두 코드 실행과 변수 접근 방식에 관련된 개념이지만 서로 다른 역할을 수행한다. 이 둘의 차이를 이해하려면 각각의 정의와 역할을 살펴보는 것이 중요하다.
실행컨텍스트 (execution context)
정의
실행 컨텍스트는 자바스크립트 코드가 실행되는 환경으로 코드가 어떻게 실행되고 변수와 함수가 어떻게 메모리에 저장되고 참조되는지를 정의한다. 즉, 자바스크립트가 코드를 실행하기 위해 필요한 모든 정보를 담고 있는 객체라고 볼 수 있다.
구성요소
1. 변수 환경
- 선언된 변수 및 함수 선언과 관련된 정보가 저장된다.
2. 렉시컬 환경
- 현재 실행 중인 코드가 참조할 수 있는 스코프와 관련된 정보가 저장된다.
- 외부 렉시컬 환경에 대한 참조를 포함해 상위 스코프를 참조한다.
3. this 바인딩
- this 키워드가 가리키는 객체를 정의한다.
실행컨텍스트의 종류
1. 전역 컨텍스트 (Global Context)
- 스크립트가 실행될 때 가장 먼저 생성되며, 브라우저 환경에서는 window객체가 전역 컨텍스트가 된다.
2. 함수컨텍스트 (Function Context)
- 함수가 호출될 때 생성되며, 함수 내부의 변수와 this를 관리한다.
3. Eval컨텍스트(Eval Context)
- eval( )함수가 실행될 때 생성된다.
실행컨텍스트의 동작
실행컨텍스트는 스택 구조로 관리되며 LIFO(Last In First Out)방식으로 처리된다.
function outer() {
console.log("Outer Start");
inner(); // inner 실행
console.log("Outer End");
}
function inner() {
console.log("Inner Function");
}
outer(); // outer 실행
실행과정
1. 전역 컨텍스트가 생성되고 스택에 추가된다.
2. outer함수 호출 시 outer함수의 실행 컨텍스트가 생성되어 스택에 추가된다.
3. inner함수 호출 시 inner함수의 실행 컨텍스트가 생성되어 스택에 추가된다.
4. 함수 실행이 완료되면 해당 컨텍스트는 스택에서 제거된다.
스코프(Scope)
정의
스코프는 변수와 함수가 접근할 수 있는 유효 범위를 의미한다. 스코프는 실행컨텍스트와 다르게 코드 구조를 기준으로 동작하며 변수의 가시성을 결정한다.
스코프의 종류
1. 전역 스코프
- 어디서든 접근 가능한 범위이다. 전역스코프에 정의된 변수는 모든 코드에서 사용할 수 있다.
const globalVar = "I am global";
function printVar() {
console.log(globalVar); // 접근 가능
}
printVar();
2. 지역스코프
- 함수 또는 블록 내부에서만 접근 가능한 범위이다.
function myFunction() {
const localVar = "I am local";
console.log(localVar); // 접근 가능
}
myFunction();
// console.log(localVar); // 오류! 지역 변수는 함수 밖에서 접근 불가
3. 블록스코프
- {}로 감싸진 블록 내부에서만 유효한 스코프이다. let과 const는 블록 스코프를 따른다.
if (true) {
let blockScoped = "I am block scoped";
console.log(blockScoped); // 접근 가능
}
// console.log(blockScoped); // 오류! 블록 스코프 밖에서 접근 불가
렉시컬 스코프
렉스컬 스코프는 코드가 작성된 위치를 기준으로 스코프가 결정되는 방식을 말한다. 자바스크립트는 렉시컬 스코프 규칙을 따르기 때문에, 함수를 어디서 호출되었는지가 아니라 함수를 어디서 선언했는지에 따라 스코프가 결정된다.
function outer() {
const outerVar = "I am outer";
function inner() {
console.log(outerVar); // outerVar를 참조 가능
}
inner();
}
outer();
'면접 준비 > javascript' 카테고리의 다른 글
[JS] 클로저란 무엇일까요? (0) | 2025.01.21 |
---|---|
[JS]자바스크립트의 데이터 타입 (0) | 2025.01.17 |
[JS]var, let, const의 차이 + TDZ (0) | 2025.01.17 |