TIL.62 Core J.S - 5. 클로저

Haiin·2021년 3월 15일
0

CoreJS

목록 보기
5/7
post-thumbnail

출저

  • 코어자바스크립트 - 정재남


클로저

어떤 함수에서 선언한 변수를 참조하는 내부함수를 외부로 전달할 경우, 함수의 실행 컨텍스트가 종료된 후에도 해당 변수가 사라지지 않는 현상.

A closure is the combination of a function and the lexical environment within which that functio was declared -MDN-

  1. LexicalEnvironment ( environmentRecord, outerEnvironment) 에 의해 변수의 유효범위인 스코프가 결정, 스코프체인 가능.
  2. 외부함수의 변수를 참조(사용)하고 있는 경우 (combination) 일때 선언될 당시의 LexicalEnvironment 와의 상호관계 라고 한다.
  3. 외부함수 실행이 다 끝나서 실행컨텍스트가 가비지컬렉터에 의해 사라져야 하는게 정상적인 루틴이다. 하지만, 위 2. 와 같이 내부함수가 외부함수의 변수를 참조하고 있을때는 가비지 컬렉터가 combination을 인지하여 외부함수의 실행이 끝나고 LexicalEnvironment를 수집하지 않아 내부함수에서 변수를 참조할 수 있는 경우, 이런 현상을 클로저라고 말한다.

클로저란 어떤 함수 A 에서 선언한 변수 a를 참조하는 내부함수 B를 외부로 전달할 경우 A의 실행 컨텍스트가 종료된 이휴에도 변수 a가 사라지지 않는 현상

let outer = function () {
  let a = 1
  let inner = function () {
    return ++a
  }
  return inner
}

let outer2 = outer() // ---(1)
console.log(outer2()) // 2 ---(2) 
console.log(outer2()) // 3 ---(3)
  1. outer함수는 이미 실행이 되어 outer2에 할당되었다. 따라서, inner 함수 자체 (실행된거 아님) 가 할당되었다고 봐도 무방하다.
  2. 따라서, 이 콘솔이 부르는 함수의 의미는 inner() 와도 같고, 이 시점은 외부함수 (outer) 가 이미 실행을 마친 후 이기 때문에 정상적으로라면 LexiocalEnvironment 는 가비지컬렉터에 의해 수집되어 사라졌어야 한다. 그렇다면 참조할 변수 a 의 값이 없으니 에러를 발생시킨다.
    하지만, 위에서 설명했듯 combination을 인지하여 수집하지 않고 그대로 메모리에 할당되어 있는 상태이기 때문에 외부함수의 변수 a 를 참조하여 결과값으로 2를 반환한다.
  3. 위의 2. 설명과 동일하게 숫자 3을 반환한다.


1. 클로저와 메모리 관리

클로저가 필요한 경우가 아닌 이상은 의도치 않게 메모리 소모가 발생하기 때문에 관리를 해주는 것이 필요하다.

let outer = (function () {
  let a = 1
  let inner = function () {
    return ++a
  }
  return inner
})()
console.log(outer())
console.log(outer())
outer = null // outer 식별자의 inner 함수 참조를 끊음


2. 클로저 활용 사례

2.1 콜백 함수 내부에서 외부 데이터를 사용하고자 할 때

콜백 함수 내부에서 외부변수를 참조하기 위한 방법
1. 클로저를 사용하는 방법
2. bind 메서드를 활용하는 방법
3. 콜백 함수를 고차함수로 바꿔서 클로저를 적극적으로 활용하는 방법


2.2 접근 권한 제어 (정보 은닉)

정보 은닉 (information hiding) 은 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 개념


2.3. 부분 적용 함수

부분 적용 함수 (partially applied function) 이란 n개의 인자를 받는 함수에 미리 m개의 인자만 넘겨 기억시켰다가, 나중에 (n-m) 개의 인자를 넘기면 비로소 원래 함수의 실행 결과를 얻을 수 있게끔 하는 함수


2.4. 커링 함수

커링 함수 (currying function) 이란 여러 개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인 형태로 구성한 것

0개의 댓글