자바스크립트 실행 컨텍스트와 클로저의 이해
F-Lab : 상위 1% 개발자들의 멘토링
AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!

실행 컨텍스트란 무엇인가?
자바스크립트에서 실행 컨텍스트는 코드가 실행될 때 제공되는 환경을 의미합니다. 함수가 호출될 때 생성되며, 콜 스택에 쌓이게 됩니다.
실행 컨텍스트는 크게 렉시컬 환경(Lexical Environment), 변수 환경(Variable Environment), 그리고 디스 바인딩(this Binding)으로 구성됩니다. 이 구성 요소들은 함수 실행 시점에서 중요한 역할을 합니다.
왜냐하면 실행 컨텍스트는 함수 호출 시점에 필요한 모든 정보를 담고 있기 때문입니다. 이를 통해 자바스크립트 엔진은 변수와 함수의 스코프를 관리하고, 실행 순서를 제어할 수 있습니다.
예를 들어, 함수 내부에서 외부 변수를 참조할 때, 렉시컬 환경이 스코프 체인을 통해 해당 변수를 찾는 역할을 합니다. 이는 클로저와도 밀접한 관련이 있습니다.
실행 컨텍스트는 자바스크립트의 비동기 동작, 이벤트 루프, 그리고 클로저와 같은 고급 개념을 이해하는 데 필수적인 요소입니다.
실행 컨텍스트와 클로저의 관계
클로저는 실행 컨텍스트와 밀접한 관련이 있습니다. 클로저는 함수가 선언될 당시의 렉시컬 환경을 기억하여, 함수가 실행된 이후에도 외부 변수에 접근할 수 있게 합니다.
왜냐하면 클로저는 실행 컨텍스트가 종료된 이후에도 메모리에서 제거되지 않는 변수를 유지하기 때문입니다. 이를 통해 함수 내부에서 외부 변수를 참조할 수 있는 강력한 기능을 제공합니다.
예를 들어, 다음 코드를 살펴보겠습니다:
function outer() {
let count = 0;
return function inner() {
count++;
return count;
};
}
const counter = outer();
console.log(counter()); // 1
console.log(counter()); // 2
위 코드에서 inner 함수는 outer 함수의 실행 컨텍스트가 종료된 이후에도 count 변수에 접근할 수 있습니다. 이는 클로저 덕분입니다.
클로저는 자바스크립트에서 상태를 유지하거나 캡슐화를 구현하는 데 자주 사용됩니다. 하지만 메모리 누수를 방지하기 위해 사용 후에는 적절히 관리해야 합니다.
호이스팅과 실행 컨텍스트
호이스팅은 자바스크립트에서 변수와 함수 선언이 코드의 최상단으로 끌어올려지는 현상을 말합니다. 이는 실행 컨텍스트 생성 과정에서 발생합니다.
왜냐하면 실행 컨텍스트는 함수 실행 전에 변수와 함수 선언을 수집하여 초기화하기 때문입니다. 이를 통해 코드 실행 중에 변수와 함수에 접근할 수 있습니다.
다음은 호이스팅의 예입니다:
console.log(a); // undefined var a = 10; console.log(a); // 10
위 코드에서 변수 a는 선언이 끌어올려져(undefined로 초기화) 첫 번째 console.log에서 접근 가능합니다. 하지만 let이나 const로 선언된 변수는 Temporal Dead Zone(TDZ)에 들어가며, 초기화되기 전에는 접근할 수 없습니다.
호이스팅은 코드의 가독성을 떨어뜨릴 수 있으므로, let과 const를 사용하는 것이 권장됩니다.
디스 바인딩과 실행 컨텍스트
디스 바인딩은 함수 호출 방식에 따라 this 키워드가 참조하는 객체가 달라지는 현상을 말합니다. 이는 실행 컨텍스트의 중요한 구성 요소 중 하나입니다.
왜냐하면 디스 바인딩은 함수가 호출되는 컨텍스트에 따라 동작이 달라지기 때문입니다. 예를 들어, 일반 함수 호출과 객체 메서드 호출에서 this는 다르게 동작합니다.
다음은 디스 바인딩의 예입니다:
const obj = {
name: 'JavaScript',
getName: function() {
return this.name;
}
};
console.log(obj.getName()); // 'JavaScript'
const getName = obj.getName;
console.log(getName()); // undefined
위 코드에서 obj.getName()은 obj를 this로 참조하지만, getName()은 전역 객체를 this로 참조합니다. 이는 디스 바인딩의 차이에서 비롯됩니다.
화살표 함수는 렉시컬 스코프를 따르기 때문에, this가 상위 컨텍스트를 참조합니다. 이를 통해 디스 바인딩 문제를 해결할 수 있습니다.
실행 컨텍스트와 비동기 동작
자바스크립트의 비동기 동작은 실행 컨텍스트와 밀접한 관련이 있습니다. 비동기 함수는 콜백 큐에 등록되며, 이벤트 루프를 통해 실행됩니다.
왜냐하면 비동기 함수는 실행 컨텍스트가 종료된 이후에도 콜백 큐에 남아 실행되기 때문입니다. 이를 통해 자바스크립트는 논블로킹 방식으로 동작할 수 있습니다.
다음은 비동기 함수의 예입니다:
setTimeout(() => {
console.log('Hello, World!');
}, 1000);
console.log('Synchronous Code');
위 코드에서 setTimeout의 콜백 함수는 1초 후에 실행됩니다. 이 과정에서 콜 스택과 이벤트 루프가 중요한 역할을 합니다.
비동기 동작을 이해하기 위해서는 실행 컨텍스트, 콜 스택, 이벤트 루프의 상호작용을 깊이 이해해야 합니다.
결론: 실행 컨텍스트의 중요성
실행 컨텍스트는 자바스크립트의 핵심 개념으로, 함수 실행, 스코프 관리, 비동기 동작 등 다양한 영역에서 중요한 역할을 합니다.
왜냐하면 실행 컨텍스트를 이해하면 자바스크립트의 동작 원리를 깊이 이해할 수 있기 때문입니다. 이를 통해 더 효율적이고 안정적인 코드를 작성할 수 있습니다.
클로저, 호이스팅, 디스 바인딩, 비동기 동작 등 실행 컨텍스트와 관련된 개념을 학습하면, 자바스크립트의 고급 기능을 효과적으로 활용할 수 있습니다.
실행 컨텍스트는 단순히 이론적인 개념이 아니라, 실제 개발에서 자주 접하는 문제를 해결하는 데 중요한 도구입니다.
따라서 실행 컨텍스트를 깊이 이해하고, 이를 활용하여 더 나은 코드를 작성하는 데 노력해야 합니다.
이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.
