>웹 프론트엔드 >JS 튜토리얼 >JavaScript의 클로저 이해: 혼란에서 명확성까지

JavaScript의 클로저 이해: 혼란에서 명확성까지

Linda Hamilton
Linda Hamilton원래의
2024-11-24 08:06:10342검색

Understanding Closures in JavaScript: From Confusion to Clarity

상상해 보세요...

프로젝트 작업을 하고 있는데 함수 실행이 완료된 후에도 변수 값을 "기억"하는 함수가 필요합니다. 클로저는 코드 어디를 가든 이전 강의에서 배운 지식을 가지고 다닐 수 있는 마법의 배낭과 같습니다. 이는 JavaScript에서 가장 강력하지만 오해되는 개념 중 하나입니다. 하지만 걱정하지 마세요. 이 가이드가 끝날 때쯤이면 머리가 긁힐 것 같은 느낌이 들다가 "아하!"로 마무리될 것입니다.


클로저란 무엇인가요? 단순화된 정의와 비유

클로저는 외부 함수 실행이 완료된 후에도 함수가 주변 상태(해당 범위의 변수)를 "기억"하는 경우입니다. 이를 관련성 있는 비유로 분석해 보겠습니다.

실제 비유: 지식의 배낭

당신이 학생이라고 상상해 보세요. 노트, 펜, 책이 담긴 배낭이 있습니다. 교실을 떠나지만(외부 기능) 배낭에 있는 모든 것에 여전히 접근할 수 있습니다(폐쇄). 나중에 문제를 해결해야 할 때마다 배낭에 저장해둔 지식을 꺼내보세요.

단순화된 정의

JavaScript에서는 다음과 같은 경우에 클로저가 발생합니다.

  1. 함수는 다른 함수 안에 정의되어 있습니다.
  2. 내부 함수는 외부 함수의 변수를 "기억"합니다.

클로저는 어떻게 작동하나요? 실제 사례

코드 예제를 통해 클로저가 실제로 작동하는 모습을 살펴보겠습니다.

예제 1: 기본 클로저

function outerFunction() {
  const outerVariable = 'Hello, Closure!';

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

  return innerFunction;
}

const myClosure = outerFunction();
myClosure(); // Output: "Hello, Closure!"

여기서 무슨 일이 일어나고 있는 걸까요?

  • innerFunction은 externalFunction에서 반환됩니다.
  • outerFunction의 실행이 완료되더라도 innerFunction은 여전히 ​​externalVariable을 기억합니다.

예 2: 카운터 폐쇄

function createCounter() {
  let count = 0;

  return function () {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // Output: 1
console.log(counter()); // Output: 2

여기서 무슨 일이 일어나고 있는 걸까요?

  • createCounter가 실행을 마친 경우에도 반환된 함수는 count 변수를 "기억"합니다.
  • 카운터를 호출할 때마다 최신 카운트 값을 업데이트하여 기억합니다.

예제 3: 루프의 클로저(일반적인 함정)

루프 내부에서 클로저를 사용하면 개발자가 문제를 일으키는 경우가 많습니다.

for (let i = 1; i <= 3; i++) {
  setTimeout(() => console.log(i), i * 1000);
}
// Output: 1, 2, 3 (each after 1 second)

이것이 작동하는 이유는 무엇입니까?

  • let 키워드는 블록 범위를 생성하므로 각 반복에는 고유한 i가 있습니다.
  • let 대신 var를 사용한 경우 var는 블록 범위를 생성하지 않으므로 모든 출력은 4가 됩니다.

? 문서: MDN 폐쇄


클로저의 일반적인 사용 사례

클로저는 단지 이론적인 개념이 아니라 놀라울 정도로 실용적입니다! 클로저가 빛나는 몇 가지 일반적인 시나리오는 다음과 같습니다.

1. 데이터 캐싱

클로저는 재사용을 위해 계산된 값을 저장하여 시간과 리소스를 절약할 수 있습니다.

function outerFunction() {
  const outerVariable = 'Hello, Closure!';

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

  return innerFunction;
}

const myClosure = outerFunction();
myClosure(); // Output: "Hello, Closure!"

2. 이벤트 핸들러

클로저는 상태를 유지하기 위해 이벤트 리스너에서 자주 사용됩니다.

function createCounter() {
  let count = 0;

  return function () {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // Output: 1
console.log(counter()); // Output: 2

3. 개인변수

클로저를 사용하여 개인 변수를 생성하고 기능을 캡슐화할 수 있습니다.

for (let i = 1; i <= 3; i++) {
  setTimeout(() => console.log(i), i * 1000);
}
// Output: 1, 2, 3 (each after 1 second)

클로저가 강력한 이유

폐쇄를 통해 다음을 수행할 수 있습니다.

  • 상태 유지: 함수 실행이 완료된 후에도 변수를 기억합니다.
  • 기능 캡슐화: 변수를 비공개로 안전하게 유지하세요.
  • 코드 단순화: 상태 관리를 위해 클로저를 사용하여 전역 변수를 사용하지 마세요.

결론: 클로저 사용에 도전해 보세요

클로저는 JavaScript의 스위스 군용 칼과 같습니다. 데이터 캐싱, 이벤트 처리, 비공개 변수 생성 등 무엇을 하든 클로저는 앱의 상태를 관리하는 강력한 방법을 제공합니다.

챌린지: 간단한 카운터를 만들거나 캐싱 메커니즘을 만드는 등 소규모 프로젝트에서 클로저를 사용해 보세요. 제어 클로저가 얼마나 많은 기능을 제공하는지 놀라게 될 것입니다!


이 기사가 마음에 드셨다면 제 작업을 후원해 보세요.

  • 커피 사주세요
  • 멘토십이나 진로 조언 전화 예약
  • 트위터에서 나를 팔로우하세요
  • LinkedIn에 연결

위 내용은 JavaScript의 클로저 이해: 혼란에서 명확성까지의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.