Closure - 닫힘/폐쇄/완결성
⇒ 클로져는 lexical environment를 참조하는 내부함수의 조합이다.
즉 클로져란 쉽게 말해 내부함수와 LexicalEnvironment의 조합이라고 볼 수 있다고 한다.

In JavaScript, closures are created every time a function is created, at function creation time.
⇒ JS에서, 클로져는 함수를 만들때마다 생성된다. 하지만 실제로 클로져라는 표현을 쓸 때는(영어로는 with closure, using closure 이런 식으로 표현된다는듯) 클로저 환경에서만 발생하는 어떤 특별한 현상에 대해서 이야기 하기 위해서 사용한다고 한다.
그래서 다시 클로저는 A의 lexical environment와 내부함수 B의 조합에서 나타나는 특별한 현상 이라고 정의할 수 있다고 한다.

outerEnvironmentReference를 통해 A의 environmentRecord에 접근하는 경우 뿐이다.a closure gives you access to an outer function’s scope from an inner function
var outer = function () {
var a = 1;
var inner = function () {
console.log(++a);
};
inner();
}
outer();
살펴보자.
우선 outer 라는 함수가 있는 것을 알 수 있다.
그 다음 inner 함수 안에서 outer에서 선언한 a의 값을 변경하는 것을 볼 수 있다.
이제 CallStack 흐름을 살펴보자~

이제 코드를 조금 바꿔보자
var outer = function () {
var a = 1;
var inner = function () {
return ++a; // console 찍는 대신에 리턴을 한다
};
return inner; // inner 함수를 호출하는 대신에 우선 리턴한다(**outer함수의 외부로 inner를 전달**)
}
var outer2 = outer(); // outer를 당장 실행하는 대신에 새로운 outer2 변수에 담아둔다.
console.log(outer2()); // 2
console.log(outer2()); // 3 ... 계속 a가 살아있고 숫자가 늘어나는 것을 확인 가능
이때 조금 복잡하지만 콜스택 흐름을 또 살펴볼 수가 있는데, 영상에 잘 나오지만 결과적으로 요약하면 다음과 같은 흐름이 발생한다:
outer2는 outer함수가 리턴한 inner함수를 물고 있다. inner함수 내부에서는 a를 리턴하는데, 이때 outerEnvironmentReference를 통해 outer 컨텍스트에서 선언한 a를 참조하기 때문에, outer가 종료된 이후에도 a가 사라지지 않고 좀비처럼 살아 있게 된다. (참조 카운트가 0이 아니기 때문이라고 한다. 즉 누군가가 참조를 하고 있기에 살아 있다는 것)outer2가 다른 값을 가지도록 할당해주면 된다. 그럼 좀비 a가 편히 잠들 수 있게 된다.