클로저

8/12/2022

작성자 : 홍원배

클로저는 독립적인 자유 변수를 가리키는 함수이다. 또는, 클로저 안에 정의된 함수는 만들어진 환경을 ‘기억한다’. - 예전 MDN
⇒ 중첩된 함수가 있고, 포함된 함수는 외부함수의 변수(자유 변수) 값을 기억하고 있다는 것
클로저는 함수와 함수가 선언된 렉시컬 환경의 조합이다.
⇒ 중첩된 함수와 그 함수가 지닌 외부 실행컨텍스트 정보를 말한다
👉
외부함수의 실행 컨텍스트를 기억하고 있는 함수
 
++ 클로저는 닫혀있다는 말인데 외부 자유변수에 대해 닫혀있기 때문에 그렇게 부른다

렉시컬 환경

실행 컨텍스트를 구성하는 내부 컴포넌트, 일종의 자료구조

렉시컬 스코프

렉시컬 스코프(어휘적 범위)는 변수나 함수가 어디에서 사용가능한지 알기 위해서 그 변수가 소스코드내 어디에서 선언 되었는지 고려한다는 의미
 

클로저 조건

  1. 중첩 함수일 것
  1. 외부 함수에서 참조하는 것이 있을 것
  1. 외부 함수보다 더 오래 유지될 것 (외부함수가 중첩된 함수를 return 해줘야 한다)
 

클로저 응용

  1. 모듈화와 은닉화
// 함수 밖 코드에서는 corruption에 접근할 수 있는 방법이 없다 function 합격자(name) { const _corruption= name.split('').reverse().join(''); return function () { // 클로저 return `합격자는 ${_corruption}로 바뀌었습니다`; }; } const success1 = 합격자('지수'); console.log(success1()); // => 수지
 
2. 반복문 클로저 개선하기
클로저로 반복문 처리 문제
⇒ 블록 스코프인 let으로 클로저를 만들면 된다

블록 렉시컬 환경

ES6의 반복문(for ... in 문, for ... of 문, while 문 등)은 코드블록을 반복 실행할 때마다 새로운 렉시컬 환경을 생성하며 이 때, var 키워드는 외부 렉시컬 환경 참조를 통해 해결한다
💻
for문과 같은 블록환경은 블록 렉시컬 환경(선언적 환경레코드)을 만든다
 
 

인용글

중첩함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우에 한정한다
클로저에 의해 참조되는 상위 스코프의 변수를 자유변수라고 부른다
클로저란 함수가 자유변수에 대해 닫혀있다 ⇒ 자유 변수에 묶여있는 함수
모던 자바스크립트 엔진은 최적화가 잘 되어있어서 클로저가 참조하고 있지 않는 식별자는 기억하지 않는다
 

참조

포이마웹 / 딥다이브 클로저