[24장] 클로저

Sheryl Yun·2024년 2월 19일
0
post-thumbnail

개념

함수를 일급 객체로 취급하는 함수형 프로그래밍의 중요한 특성

함수와 그 함수가 선언된 렉시컬 환경과의 조합 - MDN

여기서 언급된 렉시컬 환경함수가 정의될 때 정적으로 결정된 상위 스코프 환경을 말한다.

렉시컬 환경으로 상위 스코프를 결정하는 이유는 함수를 어디에서 호출하든 상관 없이 정의된 위치를 고정 기준으로 참조할 변수를 안정적으로 검색하기 위해서이다.

일반적인 클로저의 정의는 함수 안에 중첩된 내부 함수가 외부 함수 스코프의 식별자(변수 등)를 참조할 수 있는 현상, 또는 그 중첩 함수 자체를 가리킨다.

자유 변수(free variable)
중첩 함수가 참조할 수 있는 외부 함수의 변수

성립 조건

자바스크립트의 모든 함수는 상위 스코프를 기억하므로 이론적으로 모든 자바스크립트 함수는 '클로저'이다.

하지만 보통은 그렇지 않은데, 이유는 클로저로 성립될 수 있는 경우가 정해져 있기 때문이다.

함수를 클로저로 간주하는 경우 2가지

  1. 외부 함수보다 내부 함수의 생명 주기가 길 때 (= 외부 함수 바깥으로 내부 함수가 반환되어서 외부 함수 밖에서 호출될 때)
  2. 내부 함수가 외부 함수의 식별자를 참조하고 있을 때

1번을 지키지 않으면 '외부 함수가 종료되어도 내부 함수가 여전히 살아남아 외부 함수의 지역 변수를 참조'할 수 있다는 클로저의 기본 개념에 부합하지 않는다.

2번을 지키지 않으면 브라우저의 최적화에 따라 내부 함수의 상위 스코프 환경(= 외부 함수의 환경)을 따로 기억해두지 않으므로 '내부 함수가 정의될 때의 상위 스코프 환경을 기억해둔다'는 클로저의 정의에 맞지 않는다.

즉,

  1. 중첩 함수상위 스코프의 식별자를 참조하고
  2. 외부 함수 바깥으로 반환(호출)되어야

비로소 클로저라고 할 수 있다.

클로저의 활용

클로저를 사용하는 이유는 정보 은닉이다.

즉, 상태를 안전하게 숨기고 관리하기 위해서이다.

상태를 숨겨두고 특정 함수에게만 변경을 허용하며 적절하지 못한 접근으로부터 상태를 보호하기 위함이다.

profile
데이터 분석가 준비 중입니다 (티스토리에 기록: https://cherylog.tistory.com/)

0개의 댓글