JavaScript

클로저 (Closure)

2023. 8. 30. 17:29
목차
  1. 요약
  2. 설명

요약

내부 함수가 생명주기를 마감한 외부 함수의 지역변수를 참조할 수 있는 내부함수

 

설명

1. inner함수가 outer함수 내부에서 정의되고

2. 그 inner함수가 outer함수의 변수 outerVar에 접근할 수 있는 상황을 클로저 라고 합니다.

 

클로저의 원리

자바스크립트에서 함수는 정의될때 자신의 내부슬롯에 상위 스코프의 참조를 저장합니다.

 

따라서, outer함수가 생명주기를 마감하면서 실행컨텍스트에서는 제거되었지만

inner함수는 내부 슬롯에 상위 스코프의 참조를 저장하고 있기 때문에

생명주기가 끝난 outer함수의 변수에 접근이 가능합니다.

function outer() {
  const outerVar = 'I am from outer';

  function inner() {
    console.log(outerVar); // 1. inner함수가 outer함수 내부에서 정의되고
  }

  return inner;
}

const innerFunction = outer();
innerFunction(); // 2. 그 inner함수가 outer함수의 변수 outerVar에 접근할 수 있는 상황 => 클로저

위 예시 코드에 관한 설명

  1. outer함수는 innerFunction에게 inner함수를 반환하면서 사라지기 때문에 innerFunction은 inner함수 객체를 참조합니다.
  2. outer함수는 생명주기를 마감하면서 실행 컨텍스트에서는 제거 되었지만 렉시컬 환경(변수 outerVar(상위스코프), inner함수 )은 남아 있게 됩니다.
  3. innerFunction는 inner함수 객체를 참조하고 있고 inner함수 객체는 내부슬롯에 outer함수의 렉시컬 환경을 참조하기 때문에 가비지 컬렉션의 대상이 되지 않습니다.
  4. 따라서 innerFunction에 의해 inner 함수를 호출을 하면 outer 함수의 지역변수인 outerVar를 다시 참조할 수 있게 됩니다.

클로저의 조건

  1. 어떤 함수가 상위 스코프의 식별자를 참조하고 있다.
  2. 해당 함수의 외부 함수보다 더 오래 살아있다.

클로저는 왜 사용할까요?

상태를 의도치 않게 변경되지 않도록 상태를 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하기 위해 사용합니다.

 

https://www.youtube.com/watch?si=ldlkM1wyEjrwgklT&v=PVYjfrgZhtU&feature=youtu.be 

 

'JavaScript' 카테고리의 다른 글

실행컨텍스트 (Execution Context)  (0) 2023.09.04
모듈(Module)  (0) 2023.09.01
스코프(scope)  (2) 2023.08.28
[JS] 호이스팅  (0) 2023.04.23
UI/UX  (2) 2023.04.13
  1. 요약
  2. 설명
'JavaScript' 카테고리의 다른 글
  • 실행컨텍스트 (Execution Context)
  • 모듈(Module)
  • 스코프(scope)
  • [JS] 호이스팅
Summer.dev
Summer.dev
프론트엔드 개발자 Summer 입니다! 피드백은 언제나 환영입니다.
꾸준함이 무기프론트엔드 개발자 Summer 입니다! 피드백은 언제나 환영입니다.
Summer.dev
꾸준함이 무기
Summer.dev
전체
오늘
어제
  • 분류 전체보기
    • Projects
      • Next.js board-project
      • MOMO
    • 원티드
    • 우테코 프리코스
    • JavaScript
    • React
    • TypeScript
    • Node.js
    • Algorithm
      • 코플릿
      • 개념정리
    • 네트워크
    • 오류해결
    • 회고
    • 기술면접준비
    • git,github
    • 소소하게 궁금한것
    • Next.js Beta Docs 번역
    • 디자인패턴
    • 트러블슈팅
    • 번역

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 알고리즘
  • 메모이제이션

최근 댓글

최근 글

hELLO · Designed By 정상우.
Summer.dev
클로저 (Closure)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.