렉시컬 스코프란
스코프란 식별자(변수, 함수 이름과 같이 어떤 대상을 다른 대상과 구분하여 식별할 수 있는 유일한 이름) 접근 규칙에 따른 유효 범위를 뜻합니다.
렉시컬 스코프란 식별자 유효 범위가 함수를 호출할 때 결정되는 것이 아닌, 선언할 때 결정되는 것을 뜻합니다.
정적 스코프(Static scope)라고도 합니다. 자바스크립트는 렉시컬 스코프를 따릅니다.
렉시컬 스코프는 변수의 유효 범위(scope)를 결정하는 방식 중 하나로, 변수가 어디서 정의되었는지에 따라 결정됩니다.
이 개념은 프로그래밍 언어에서 매우 중요한 개념 중 하나로 여겨지며, 다양한 언어에서 일관되게 적용됩니다.
1. 렉시컬 스코프의 기본 원리
렉시컬 스코프는 코드가 작성된 위치에 기반하여 변수의 스코프를 정의합니다. 함수를 어디에서 정의했는지가 스코프를 결정하는 주된 요소입니다. 다음 예제를 통해 이를 이해해 보겠습니다.
// 전역 변수
var globalVariable = 'Global';
function outerFunction() {
// outerFunction 내부의 변수
var outerVariable = 'Outer';
function innerFunction() {
// innerFunction 내부에서 outerVariable과 globalVariable에 접근 가능
console.log(globalVariable); // "Global"
console.log(outerVariable); // "Outer"
var innerVariable = 'Inner';
console.log(innerVariable); // "Inner"
}
innerFunction();
}
outerFunction();
위 예제에서 innerFunction은 outerFunction 내부에 정의되어 있습니다. 따라서 innerFunction 내부에서는 outerVariable과 globalVariable에 접근할 수 있습니다. 하지만 innerFunction 내부에서 정의된 innerVariable은 innerFunction 내부에서만 접근 가능합니다.
2. 동적 스코프와의 차이점
렉시컬 스코프는 함수를 어디에서 정의했는지에 따라 스코프를 결정하는 반면, 동적 스코프는 함수가 어디에서 호출되었는지에 따라 스코프를 결정합니다. 대부분의 프로그래밍 언어에서는 렉시컬 스코프를 따르지만, Bash와 같은 몇 가지 언어에서는 동적 스코프를 사용합니다.
다음은 동적 스코프와 렉시컬 스코프의 차이를 보여주는 예제입니다:
var globalVariable = 'Global';
function outerFunction() {
var outerVariable = 'Outer';
function innerFunction() {
console.log(globalVariable); // "Global"
console.log(outerVariable); // "Outer"
}
return innerFunction;
}
var inner = outerFunction();
inner(); // 여기서 호출되는 것에 따라 스코프가 결정됨
위 예제에서 inner 함수는 outerFunction 내에서 반환되고, 전역에서 호출됩니다. 이 때 inner 함수 내부에서 outerVariable에 접근할 수 있는지 여부는 함수가 어디에서 정의되었는지가 아니라, 어디서 호출되었는지에 따라 결정됩니다. 이는 동적 스코프의 예시입니다.
3. 클로저와 렉시컬 스코프
클로저(closure)는 렉시컬 스코프를 활용하는 중요한 개념입니다. 클로저는 함수가 자신이 정의된 렉시컬 환경(outer function의 변수 등)에 접근할 수 있는 특성을 말합니다. 이를 통해 함수는 자신이 생성될 때의 상황을 기억하고, 나중에 호출될 때 이 상태를 유지할 수 있습니다.
function createCounter() {
var count = 0;
return function() {
count++;
return count;
};
}
var counter1 = createCounter();
console.log(counter1()); // 1
console.log(counter1()); // 2
var counter2 = createCounter();
console.log(counter2()); // 1
위 예제에서 createCounter 함수는 클로저를 사용하여 내부의 count 변수를 보호하고 있습니다. counter1과 counter2는 각각 독립적인 클로저를 생성하며, 따라서 각자의 count 상태를 유지합니다.
결론
렉시컬 스코프는 변수의 유효 범위를 결정하는 중요한 원리로, 함수를 어디에서 정의했는지에 따라 결정됩니다. 이를 이해하면 변수의 범위가 어디까지 확장되는지 예측할 수 있으며, 클로저와 같은 고급 개념을 이해하는 데도 중요한 기반을 제공합니다.
상품 리스트 페이지 코드 리뷰 (0) | 2024.06.25 |
---|---|
HTTP 메소드 (0) | 2024.06.21 |
리액트 명령어 정리 (0) | 2024.06.19 |
로그인 회원가입 유효성 검사 스크립트 & 코드리뷰 (0) | 2024.06.15 |
자바스크립트에서 this란? (0) | 2024.06.14 |