IT 노트/JavaScript

[JavaScript] Scope스코프와 Closer클로저

czecze 2024. 7. 9. 14:37
반응형

JavaScript에서 스코프와 클로저는 매우 중요한 개념입니다. 스코프는 변수와 함수가 어디서 어디까지 접근 가능한지를 정의하는 범위입니다. 클로저는 함수가 정의될 때의 렉시컬 환경을 기억하여, 함수가 스코프 밖에서 호출되어도 해당 환경에 접근할 수 있게 하는 기능입니다.

스코프 (Scope)

JavaScript의 주요 스코프 유형은 다음과 같습니다:

1. 전역 스코프 (Global Scope): 코드의 모든 부분에서 접근 가능한 변수나 함수.
2. 함수 스코프 (Function Scope): 함수 내부에서 선언된 변수나 함수는 함수 외부에서 접근할 수 없습니다.
3. 블록 스코프 (Block Scope): letconst로 선언된 변수는 그들이 선언된 블록(일반적으로 {} 내부) 내에서만 접근 가능합니다.

var x = 10; // 전역 변수

function myFunction() {
    var y = 20; // 함수 스코프 변수
    console.log(x); // 전역 변수 x는 함수 내에서 접근 가능
    console.log(y); // 지역 변수 y는 함수 내에서 접근 가능
}

myFunction();
console.log(x); // 전역 변수 x는 여전히 접근 가능
// console.log(y); // 오류: y는 myFunction의 지역 변수로서 함수 외부에서는 접근 불가능

 

클로저 (Closure)

클로저는 함수가 생성될 때 그 함수가 선언된 렉시컬 환경을 “기억”하는 특성을 말합니다. 이는 함수가 스코프 외부에서 실행될 때도 그 환경에 있는 변수에 접근할 수 있게 합니다.

function makeCounter() {
    var count = 0; // `count`는 `makeCounter` 함수의 지역 변수

    return function() {
        return count++; // 내부 함수가 외부 함수의 변수 `count`를 참조
    };
}

var counter = makeCounter(); // `counter`는 이제 클로저
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2

// 각각의 `counter` 인스턴스는 독립적인 `count` 변수의 참조를 가집니다.
var anotherCounter = makeCounter();
console.log(anotherCounter()); // 0
console.log(anotherCounter()); // 1

이 클로저 예시에서, makeCounter 함수는 내부 함수를 반환하고, 이 내부 함수는 부모 함수의 count 변수를 참조합니다. 이 내부 함수는 makeCounter 함수의 스코프 밖에서 호출되더라도, count 변수에 대한 참조를 유지합니다. 이것이 클로저의 핵심적인 특성입니다.

클로저의 사용 사례

클로저는 데이터 캡슐화, 이벤트 핸들러, 콜백 함수, 모듈 패턴 등 다양한 상황에서 유용하게 사용됩니다. 예를 들어, 개인 정보를 외부로부터 보호하면서 접근을 제어하려는 경우 클로저를 활용할 수 있습니다.

이러한 스코프와 클로저의 개념은 JavaScript를 깊이 이해하고 효과적으로 사용하는 데 있어 필수적입니다.

반응형