JS Closure


### 클로저라는 현상은 런타임 중에 루틴을 만들 수 있는 언어
고차 함수를 위해 컨텍스트를 메모리에 남겨두어서 다시 참조할 수 있게
흔히 함수 내에서 함수를 정의하고 사용하면 클로저라고 한다
하지만 대개는 정의한 함수를 리턴하고 사용은 바깥에서 하게된다
```typefunction getClosure() {  var text = 'variable 1';  return function() {    return text;  };}var closure = getClosure();console.log(closure()); // 'variable 1'```

MDN에서는 클로저를 다음과 같이 정의하고 있다.



루틴(함수)이 생겼을 때, 자유변수가 존재할 수 있는데, 루틴이 그 자유 변수를 참조할 수 있다. 참조하면 해지를 못시킨다. free variables closure. 짧게 말해 closure이다.
JS는 중첩되어 있는 클로저 영역을 마구마구 생성할 수 있다. 중괄호를 계속 반복해서 쳐도 클로져가 만들어진다.

메인 플로우에 변수 a가 있다. 근데 블록 스코프안에 또 a가 있다. 근데 루틴안에 또 a가 있다. 이런걸 shadowing이라고 한다.

### closure를 이용한 은닉화
```typefunction hello(name) {  var _name = name;  return function() {    console.log('Hello, ' + _name);  };}var hello1 = hello('승민');var hello2 = hello('현섭');var hello3 = hello('유근');hello1(); // 'Hello, 승민'hello2(); // 'Hello, 현섭'hello3(); // 'Hello, 유근'```

shadowing은 언제 쓰는 걸까?
⇒ 네임스페이스를 정의할 때 쓰는 것이다. 이 이름이 내부쪽에서 사용될 때 바깥쪽 자유변수를 오염시키지 않게 하기 위함이다

### 일종의 바인딩이라 해제필요
```typefunction hello(name) {  var _name = name;  return function() {    console.log('Hello, ' + _name);  };}var hello1 = hello('승민');var hello2 = hello('현섭');var hello3 = hello('유근');hello1(); // 'Hello, 승민'hello2(); // 'Hello, 현섭'hello3(); // 'Hello, 유근'// 여기서 메모리를 release 시키기 클로저의 참조를 제거해야 한다.hello1 = null;hello2 = null;hello3 = null;```



> [JavaScript 클로저(Closure)](https://hyunseob.github.io/2016/08/30/javascript-closure/)

> [클로저](https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Closures)

> [자바스크립트 Closure, Nested closure, Shadowing](https://abelog.netlify.app/javascript/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-closure,-nested-closure,-shadowing/)



> 클로저는 **독립적인** (자유) 변수를 가리키는 함수이다. 또는, 클로저 안에 정의된 함수는 **만들어진 환경**을 ‘기억한다’.





