클로저

function outer(param){
    const outerParam = `This is how ${param} works!`;
      function inner() {
        console.log(outerParam);
    }
      return inner;
}

const closure = outer('CLOSURE');
closure(); // This is how CLOSURE works!
  • 클로저란?
    • 클로저는 함수가 선언된 환경의 (렉시컬) 스코프를 기억하여 함수가 스코프 밖에서 실행될 때에도 이 스코프에 접근할 수 있게 하는 기술
    • 함수 안의 함수
    • 특징
      • inner 함수는 outer 함수의 지역 변수 참고 가능
      • outer 함수가 실행되어 소멸되어도 inner 함수는 outer 함수의 지역변수 참고 가능
      • private 변수 선언 가능

클로저를 사용해 private한 모듈을 만들어 보자!

function getPrivate(){
  const log = console.log;
  const token = 'AaddfdBF343DVDFD';
  let API = {};

  function check(reqToken) {
      return token === reqToken;
  }

  API.register = (id, pass) => {
      log(`register! id: ${id} padd: ${pass}`);
  };

  API.login = (id, pass) => {
      log('login!');
  };

  // spread operater를 사용한 객체 복사
  API = {
      ...API,
    update: (id, pass) => {
        log('update!');
    },
    delete: (id) => {
        log(`delete! ${id}`);
    }
  };

  // Object.assign()을 사용한 객체 복사
  API = Object.assign({}, API, { check: check });  
  return API;
}
API.register('id', 'pass'); // Error! API is not defined!
const api = getPrivate(); // API가 api 변수에 할당 된다.
api.register('IDDDD', 'PASSS'); // register! id: IDDDD padd: PASSS
  • 클로저 + 싱글톤 private한 모듈
const api = (function getPrivate(){
  const log = console.log;
  const token = 'AaddfdBF343DVDFD';
  let API = {};

  function check(reqToken) {
      return token === reqToken;
  }

  API.register = (id, pass) => {
      log(`register! id: ${id} padd: ${pass}`);
  };

  API.login = (id, pass) => {
      log('login!');
  };

  // spread operater를 사용한 객체 복사
  API = {
      ...API,
    update: (id, pass) => {
        log('update!');
    },
    delete: (id) => {
        log(`delete! ${id}`);
    }
  };

  // Object.assign()을 사용한 객체 복사
  API = Object.assign({}, API, { check: check });  
  return API;
})();

api.register('IDDDD', 'PASSS'); // register! id: IDDDD padd: PASSS