클로저
- 클로저의 공식적인 정의는 
함수와 그 함수가 선언된 렉시컬 환경과의 조합이다. 다만, 일반적으로 외부 함수보다 중첩함수가 더 오래되는 경우 중첩 함수는 이미 생명 주기가 종료된 외부 함수를 참조할 수 있고 이러한 중첩함수를 클로저라 부른다. 함수의 실행 컨텍스트에서 제거됬다고, 렉시컬 환경까지 소멸하는 것은 아니다. 
function foo (){
  const x = 1;
  
  
  
  function bar (){
    console.log(x);
  }
  bar();
}
foo();
function foo () {
  const x = 1;
  const y = 2;
  
  
  
  
  function bar() {
    console.log(x);
  }
  return bar;
}
const bar = foo();
bar();
- 클로저는 상태가 의도치 않게 변경되지 않도록 안전하게 은닉하고, 특정 함수에게만 상태 변경을 허용하여 상태를 안전하게 변경하고 유지하기 위해 사용한다.
 
const increase = (function(){
  let num = 0;
  
  
  return function() {
    return ++num;
  };
}()};
console.log(increase()); 
console.log(increase()); 
console.log(increase());