스코프 체인
스코프 체인이란 프로그래밍에서 변수와 함수 등을 참조할 때 해당 변수 또는 함수의 유효 범위를 결정하는 개념을 말한다. 특히 JavaScript와 같은 동적 스크립트 언어에서 중요한 역할을 한다.
스코프 체인은 변수나 함수를 찾을 때 어떤 순서로 범위를 확인할 지 정의하는데 일반적으로 다음과 같은 우선순위로 작동한다.
- 현재 스코프
코드가 실행 중인 현재 범위 내에서 변수 또는 함수를 찾는다. - Outer 스코프
현재 범위의 바깥 범위에서 변수 혹은 함수를 찾는다. 이러한 계층 구조를 따라가며 변수를 찾을 때까지 부모 범위를 검사한다. - Global 스코프
모든 범위의 부모에 해당하는 전역 범위에서 변수나 함수를 찾는다. 즉, 전역 범위는 모든 스코프 체인의 최종 도착지에 해당한다.
실행 컨텍스트(Execution context)
JavaScript 엔진이 코드를 실행할 때 생성되는 환경을 나타낸다. 각 실행 컨텍스트는 변수, 함수 및 this 값을 포함하는 범위와 실행 환경 정보를 갖는다. 각 실행 컨텍스트는 스코프 체인을 생성하고 관리하며 현재 실행 중인 코드와 관련된 범위 정보를 제공한다.
실행 컨텍스트가 실행되면 엔진이 스코프 체인을 통해 렉시컬 스코프를 먼저 파악하게 된다.
위와 같은 그림은 함수 호출로 인해 실행 컨텍스트 스택에 각 실행 컨텍스트가 쌓이는 모습을 나타낸 것이다.
함수 b에서 변수 v를 사용해야 하는 경우, b() 함수 안에서 변수 v를 탐색한 후 없으면 a(), 없으면 전역 변수를 탐색하게 된다.
이 과정이 스코프 체인에 해당하는 것이다.
클로저
클로저는 함수가 자신이 선언된 범위 밖에서도 해당 범위의 변수에 접근하게 할 수 있는 메커니즘을 말한다.
클로저 생성 시, 해당 함수의 실행 컨텍스트가 스코프 체인에 저장된다. 이로 인해 함수 내에서 선언된 변수는 실행 컨텍스트에서 벗어난 곳에서도 사용할 수 있게 되는 것이다. 예시 코드는 다음과 같다.
function outerFunction() {
var outerVar = 10;
function innerFunction() {
console.log(outerVar);
}
return innerFunction;
}
var myClosure = outerFunction();
myClosure(); // 출력: 10
myClosure는 outerFunction에서 생성된 innerFunction의 인스턴스이다. 따라서 myClosure를 호출하면 outerVar에 접근할 수 있으며 10을 출력할 수 있는 것이다.
이는 outerFunction의 범위를 기억하는 클로저를 형성했기 때문에 가능하다.
클로저 기능은 비동기 작업이나 데이터 은닉에서 매우 유용하게 사용될 수 있다.