"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > JavaScript의 클로저 이해: 종합 가이드

JavaScript의 클로저 이해: 종합 가이드

2024-07-30에 게시됨
검색:270

Understanding Closures in JavaScript: A Comprehensive Guide

JavaScript는 다재다능하고 강력한 언어이며 가장 흥미로운 기능 중 하나는 클로저 개념입니다. 클로저는 특히 범위 및 변수 액세스와 관련하여 JavaScript 함수의 작동 방식을 이해하는 데 기본입니다. 이 튜토리얼에서는 클로저가 무엇인지, 어떻게 작동하는지 살펴보고 이 개념을 익히는 데 도움이 되는 실제 예제를 제공합니다.

클로저란 무엇입니까?

클로저는 어휘 범위 밖에서 함수가 실행되는 경우에도 해당 어휘 범위에 대한 액세스를 유지하는 함수입니다. 간단히 말해서, 클로저를 사용하면 함수가 생성된 환경을 "기억"할 수 있습니다.

클로저가 중요한 이유는 무엇입니까?

다음과 같은 이유로 폐쇄가 필수적입니다.

  • 데이터 개인정보 보호: 클로저를 사용하면 함수 외부에서 접근할 수 없는 비공개 변수를 생성할 수 있습니다.

  • 상태 저장 함수: 함수가 호출 사이의 상태를 유지할 수 있도록 해줍니다.

  • 함수형 프로그래밍: 클로저는 함수형 프로그래밍의 핵심 개념으로, 고차 함수와 커링을 가능하게 합니다.

클로저는 어떻게 작동하나요?

클로저를 이해하기 위해 기본 예부터 시작해 보겠습니다.

function outerFunction() {
    let outerVariable = 'I am outside!';

    function innerFunction() {
        console.log(outerVariable);
    }

    return innerFunction;
}

const myClosure = outerFunction();
myClosure(); // Output: I am outside!

위 예에서:

  • outerFunction은 변수 externalVariable을 생성하고 innerFunction을 정의합니다.

  • innerFunction은 어휘 범위에 있는 externalVariable에 액세스합니다.

  • outerFunction은 innerFunction을 반환하여 클로저를 생성합니다.

  • myClosure가 호출되면 externalFunction이 실행을 마쳤음에도 불구하고 여전히 externalVariable에 액세스할 수 있습니다.

클로저의 실제 예

1. 개인 변수 생성

클로저는 특정 기능을 통해서만 액세스하거나 수정할 수 있는 비공개 변수를 만드는 데 사용할 수 있습니다.

function createCounter() {
    let count = 0;

    return {
        increment: function() {
            count  ;
            return count;
        },
        decrement: function() {
            count--;
            return count;
        },
        getCount: function() {
            return count;
        }
    };
}

const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.decrement()); // 1
console.log(counter.getCount()); // 1

이 예에서 count는 increment, decrement 및 getCount 메소드를 통해서만 액세스하고 수정할 수 있는 전용 변수입니다.

2. 동적으로 함수 만들기

클로저를 사용하면 특정 데이터를 사용하여 동적으로 함수를 만들 수 있습니다.

function greetingGenerator(greeting) {
    return function(name) {
        return `${greeting}, ${name}!`;
    };
}

const sayHello = greetingGenerator('Hello');
const sayGoodbye = greetingGenerator('Goodbye');

console.log(sayHello('Alice')); // Hello, Alice!
console.log(sayGoodbye('Bob')); // Goodbye, Bob!

여기에서 GreetingGenerator는 인사말 변수로 클로저를 생성하여 호출 시 sayHello 및 sayGoodbye가 이를 사용할 수 있도록 합니다.

삼. 비동기 코드에서 상태 유지

클로저는 코드의 여러 부분에서 상태를 유지해야 하는 비동기 프로그래밍에 특히 유용합니다.

function fetchData(url) {
    let cache = {};

    return function() {
        if (cache[url]) {
            return Promise.resolve(cache[url]);
        } else {
            return fetch(url)
                .then(response => response.json())
                .then(data => {
                    cache[url] = data;
                    return data;
                });
        }
    };
}

const getUserData = fetchData('https://jsonplaceholder.typicode.com/users/1');

getUserData().then(data => console.log(data)); // Fetches data from the API
getUserData().then(data => console.log(data)); // Returns cached data

이 예에서는 getUserData에 대한 여러 호출에서 캐시가 유지되므로 URL당 한 번만 데이터를 가져오고 이후에 재사용할 수 있습니다.

결론

클로저는 함수가 해당 범위 밖에서 실행될 때에도 어휘 범위에 대한 액세스를 유지할 수 있도록 하는 JavaScript의 강력한 기능입니다. 이는 데이터 개인정보 보호, 상태 저장 기능을 활성화하며 함수형 프로그래밍의 초석입니다. 클로저를 이해하고 사용하면 보다 효율적이고 읽기 쉽고 유지 관리 가능한 JavaScript 코드를 작성할 수 있습니다.

프로젝트에서 클로저를 실험해 보면 곧 그 다양성과 강력함을 알게 될 것입니다. 즐거운 코딩하세요!

릴리스 선언문 이 기사는 https://dev.to/prinxard/understanding-closures-in-javascript-a-comprehensive-guide-1ke9?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3