Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

나 개발자 할래요

클로저 본문

개발자 되는 법.../메모...

클로저

개발_자 2024. 12. 9. 19:03

참고한 것들..

https://www.youtube.com/watch?v=WbVVKY9CDP0

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Closures#클로저closure

 

클로저 - JavaScript | MDN

클로저는 주변 상태(어휘적 환경)에 대한 참조와 함께 묶인(포함된) 함수의 조합입니다. 즉, 클로저는 내부 함수에서 외부 함수의 범위에 대한 접근을 제공합니다. JavaScript에서 클로저는 함수 생

developer.mozilla.org

 

https://enjoydev.life/blog/javascript/6-closure

 

JavaScript의 클로저(Closure)란? (feat. React의 useState)

JavaScript의 클로저의 원리를 쉽게 배워보고 어떤 상황에 사용되는지 알아보도록 하겠습니다.

enjoydev.life

 

https://poiemaweb.com/js-closure

 

Closure | PoiemaWeb

클로저(closure)는 자바스크립트에서 중요한 개념 중 하나로 자바스크립트에 관심을 가지고 있다면 한번쯤은 들어보았을 내용이다. execution context에 대한 사전 지식이 있으면 이해하기 어렵지 않

poiemaweb.com

 


참고한 것들을 바탕으로 이해가 잘 안 되는 부분에 대해...

 

  • 클로저란

함수와 함수가 선언됐을 때의 렉시컬 환경(Lexical environment)과의 조합

 

..?뭔소리고

더보기

💡

함수 → 반환된 내부함수

함수가 선언됐을 때의 렉시컬 환경 →내부함수가 선언됐을 때의 스코프

즉, 반환된 내부함수가 자신이 선언됐을 때의 환경(Lexical environment)인 스코프를 기억하여 자신이 선언됐을 때의 환경(스코프)밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수

⇒ 클로저는 자신이 생성될 때의 환경(Lexical environment)을 기억하는 함수

 

  • 예시 코드1
function outerFunc() {
  let x = 23; // 자유변수

  function innerFunc() { // 자유변수에 엮여있는 함수(=클로저)
    console.log(x);
  }

  innerFunc();
}

outerFunc(); // 23
  • 예시 코드2
function outerFunc() {
  let count = 0;

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

let counter = outerFunc();

console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2

 

 

 

  • 클로저를 사용하는 이유 - 상태 유지
function debounce(callback, delay) {
  let timer = null;

  return function () { 
    clearTimeout(timer); 
    timer = setTimeout(() => {
      callback.apply(this, arguments);
    }, delay);
  };
}

• timer는 디바운스가 실행될 함수와 다른 스코프에 있기 때문에 timer에 대한 최신 상태를 유지할 수 있습니다.

 

..?뭔소리고

더보기

💡

반환된 함수는 실행될 자신의 스코프를 따로 가집니다.

즉, 반환된 함수는 자신만의 실행 환경(스코프)를 가지지만, 클로저를 통해 debounce의 timer를 계속 참조할 수 있습니다.

 

 

  • 클로저와 React의 useState
const React = (function () {
  let state;
  return  {
    useState(initialValue) {
      if(state === undefined) state = initialValue;

      const setState = (newValue) => {
        state = newValue;
      };

      return [state, setState];
    }
  }
})(); // ()() : 즉시 실행 함수 (IIFE)

const Counter = () => {
  const [count, setCount] = React.useState(0);

  console.log(count); // 0
  setCount(1);
  console.log(count); // 1
};

함수형 컴포넌트의 경우 렌더링이 발생하면 함수 자체가 다시 호출됩니다.

따라서 상태를 관리하기 위해서는 함수가 재호출 되었을 때 이전 상태를 기억하고 있어야 합니다.

 

 

  • 개념 정리

- 렉시컬 환경

선언 위치에 따라 상위 스코프가 결정되는 것, 선언 당시 환경

 

- 클로저

선언 당시 환경(렉시컬 스코프)을 기억하기 때문에, 생명 주기가 끝난 외부 함수의 변수에 접근 가능한 함수

 

- 클로저 동작 원리

자바스크립트 모든 함수는 렉시컬 스코프에 대한 참조값을 저장하는데, 해당 참조값을 통해 외부 함수의 변수에 접근 가능하게 됩니다.

 

- 클로저 사용 이유

상태 유지, 정보 은닉, 전역 변수 사용 억제

 

- useState와 클로저

리렌더링 되었을 때 이전 상태를 기억하기 위해 클로저의 상태 유지 특성을 사용했습니다.

 

- 클로저의 단점

메모리 누수

'개발자 되는 법... > 메모...' 카테고리의 다른 글

리액트의 props와 state  (0) 2024.12.18
이벤트 루프  (1) 2024.12.17
tanstack-query의 stale time과 gc time  (1) 2024.12.13
실행 컨텍스트  (1) 2024.12.12
reflow와 repaint의 차이점  (0) 2024.12.11