클로저
8/12/2022
작성자 : 홍원배
클로저는 독립적인 자유 변수를 가리키는 함수이다. 또는,클로저 안에 정의된 함수는 만들어진 환경을 ‘기억한다’. - 예전 MDN
⇒ 중첩된 함수가 있고, 포함된 함수는 외부함수의 변수(자유 변수) 값을 기억하고 있다는 것
클로저는 함수와 함수가 선언된 렉시컬 환경의 조합이다.
⇒ 중첩된 함수와 그 함수가 지닌 외부 실행컨텍스트 정보를 말한다
외부함수의 실행 컨텍스트를 기억하고 있는 함수
++ 클로저는 닫혀있다는 말인데 외부 자유변수에 대해 닫혀있기 때문에 그렇게 부른다
렉시컬 환경
실행 컨텍스트를 구성하는 내부 컴포넌트, 일종의 자료구조
렉시컬 스코프
렉시컬 스코프(어휘적 범위)는 변수나 함수가 어디에서 사용가능한지 알기 위해서 그 변수가 소스코드내 어디에서 선언 되었는지 고려한다는 의미
클로저 조건
- 중첩 함수일 것
- 외부 함수에서 참조하는 것이 있을 것
- 외부 함수보다 더 오래 유지될 것 (외부함수가 중첩된 함수를 return 해줘야 한다)
클로저 응용
- 모듈화와 은닉화
// 함수 밖 코드에서는 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문과 같은 블록환경은 블록 렉시컬 환경(선언적 환경레코드)을 만든다
인용글
중첩함수가 상위 스코프의 식별자를 참조하고 있고 중첩 함수가 외부 함수보다 더 오래 유지되는 경우에 한정한다
클로저에 의해 참조되는 상위 스코프의 변수를 자유변수라고 부른다
클로저란 함수가 자유변수에 대해 닫혀있다 ⇒ 자유 변수에 묶여있는 함수
모던 자바스크립트 엔진은 최적화가 잘 되어있어서 클로저가 참조하고 있지 않는 식별자는 기억하지 않는다
참조
포이마웹 / 딥다이브 클로저