본문 바로가기
JavaScript

[코어 자바스크립트] 3.클로저

by imsoncod 2021. 6. 26.

1. 클로저란?

외부함수의 변수를 참조하는 내부함수가 외부로 전달될 경우 외부함수가 종료되어도 참조되는 변수가 메모리에 살아있는 현상GC의 대상이 되지 않습니다.

  1. [6]번째 줄에서 inner함수 자체를 반환했습니다.
  2. [8]번째 줄에서 outer2변수가 outer함수의 실행을 통해 반환된 inner함수를 참조합니다.
  3. inner함수의 실행컨텍스트는 아래와 같습니다.
    • outerEnvironmentRecord : { (선언된 시점) == outer 함수의 Lexical Environment }
    • enrivonmentRecord : { }
  4. [9, 10]번째 줄에서 함수를 실행하면 스코프체인을 통해 outer 함수의 Lexical Environmenta변수에 접근합니다.
  5. outer 함수가 종료되었음에도 Lexical Environment에 접근할 수 있는 이유는 변수 ainner함수가 참조하고 있고 이 inner함수를 outer2변수가 참조하고 있기 때문입니다. GC는 참조되고 있는 대상을 수집대상에서 제외합니다.

2. 클로저와 메모리 관리

클로저는 참조되는 변수를 메모리에 살아있게 합니다.
더 이상 해당 변수가 필요하지 않은 시점에는 Reference Count를 0으로 만들어 GC의 대상이 되도록 만들어주어야 합니다.

Reference Count를 0으로 만들기 위해서는 보통 null이나 undefined를 할당해줍니다.

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

정보은닉은 어떤 모듈의 내부 로직에 대해 외부로의 노출을 최소화해서 모듈간의 결합도를 낮추고 유연성을 높이고자 하는 현대 프로그래밍 언어의 중요한 개념중 하나입니다.

접근 권한 제어에는 보통 public, private, protected 3종류가 있습니다.
자바스크립트에서는 변수 자체에 이러한 접근제한자를 붙여 권한을 제어할 수 없습니다.

따라서, 클로저 + return을 사용하여 public과 private의 권한을 구분할 수 있습니다.

outer 변수를 통해 함수를 사용할 수는 있지만 내부에는 접근할 수 없습니다. 하지만 outer함수가 returninner변수에는 접근할 수 있습니다.

// 변수의 상태를 접근제한자로 표현해보면 아래와 같습니다.
private var a = 1;
public inner = func () { ... } 

위처럼 return된 변수만 공개(public)멤버가 되고 그렇지 않은 변수들은 비공개(private)멤버가 됩니다.

캡슐화는 간단히 내부의 값들을 외부에서 참조하지 못하도록 숨기는것입니다. 클로저가 그 역할을 할 수 있을 것으로 보입니다.

4. 커링 함수

여러개의 인자를 받는 함수를 하나의 인자만 받는 함수로 나눠서 순차적으로 호출될 수 있게 체인형태로 구성한 것으로 마지막 인자가 전달되기 전까지 원본함수가 실행되지 않습니다.

인자가 많으면 가독성이 떨어질 수 있어서 ES6에서는 아래처럼 화살표 함수를 사용하여 간결하게 표시합니다.

반응형

댓글