TIL - Closure 클로저

moontag·2022년 5월 12일
0

JavaScript TIL

목록 보기
8/20
post-thumbnail




Closure

함수가 선언된 어휘적 환경(Lexical environment)의 조합
이 환경은 클로저가 생성된 시전의 유효범위 내에 있는 모든 지역변수로 구성된다

Closure 란 ?

  • 중첩함수(함수가 함수를 리턴) 일 시
    외부함수의 생명주기가 끝나도
    외부함수(상위스코프)의 식별자를 참조하고
    외부함수보다 더 오래 살아있다면 그게 클로저.

  • 클로저 - 외부함수 변수에 접근가능한 내부함수

  • 클로저 - 함수가 자유변수에 의해 닫혀있다

  • 클로저에 의해 참조된 변수 - 자유변수


클로저 함수

외부함수의 컨텍스트에 접근할 수 있는 내부함수
외부함수가 실행 종료되어 생명주기가 끝나도 클로저함수는 외부함수의 렉시컬환경에 접근하여 자유변수를 가져올 수 있다.

장점

  • 외부함수가 실행되어 생명주기가 끝나도,
    외부함수의 지역변수를 자유변수로 가져와서 렉시컬환경에 저장했기때문에
    내부함수에서 사용할 수 있다

  • 불필요한 전역변수를 줄이고 스코프로 안전하게 값을 다룰 수 있다

  • 모듈화에 유리
    클로저 모듈 패턴 - 데이터와 메서드를 묶어서 분리하기 때문에 재사용성 증가한다


단점

일반 함수에선 함수 실행 종료 후 가비지 컬렉션 대상이 되었을 객체가,
클로저에서는 메모리 상에 남아 있는다. 외부 함수 스코프가 내부 함수에 의해 언제든지 참조될 수 있기 때문이다. 따라서 클로저를 남발할 경우 퍼포먼스 저하가 발생한다.

*JS는 가비지 컬렉션을 통해 메모리 관리.
객체가 참조 대상이 아닐 때, 가비지 컬렉션에 의해 자동으로 메모리 할당이 해제된다



클로저 패턴 사용예시

  1. 커링 Curring
    하나의 함수가 n개의 인자를 받는 대신 n개의 함수를 만들어서 각각 인자를 받게 하는 방법

  2. 클로저 모듈 Closure Module
    외부함수 스코프 안쪽에 변수를 숨겨서 변수가 함수 밖에 노출되는 것을 방지하는 방법


상위스코프 결정 시점

  • 함수호출 시점
    동적 스코프 - 대부분 프로그래밍 언어

  • 함수정의 시점
    정적 스코프(렉시컬 스코프) - JavaScript
    JS의 함수는 태어나면서 자신의 내부 슬롯에 상위스코프에 대한 참조를 저장한다


스코프 체인 🔗

스코프가 계층적으로 연결된 것으로, 물리적으로 존재한다

  • JS 엔진은 스코프체인을 통해 변수를 참조한다

  • 스코프체인의 반방향성
    원하는 변수가 내부함수에 없으면 외부함수로 올라간다 거기도 없으면 전역스코프로 올라간다. 찾는 참조값이 있는 상위스코프로 올라가서 식별자를 참조한다




참조

[10분 테코톡] 🍧 엘라의 Scope & Closure

모던자바스크립트 - 변수의 유효범위와 클로저









profile
터벅터벅 나의 개발 일상

0개의 댓글