//커링(currying, 함수 하나가 n개의 인자를 받는 대신 n개의 함수를 만들어 각각 인자를 받게 하는 방법)

let makeTag = tag => content => {
  return `<${tag}>${content}</${tag}>`;
}
let div = makeTag('div');
console.log(div('closure')) //'<div>closure</div>'

let p = makeTag('p');
console.log(p('currying')) //'<p>currying</p>'





//클로저 모듈(변수를 외부 함수 스코프 안쪽에 감추어, 변수가 함수 밖에서 노출되는 것을 막는 방법)

let makeCounter = () => {
  let value = 0;
  return{
    increase: () => {value = value + 1},
    decrease: () => {value = value - 1},
    getValue: () => value
  }
}

let counter = makeCounter();
counter.increase();
counter.increase();
counter.getValue(); //2

let deCounter = makeCounter();
deCounter.decrease();
deCounter.decrease();
deCounter.getValue(); //-2



// 클로저의 단점: 일반 함수였다면 함수 실행 종료 후 
//가비지 컬렉션(참고 자료: MDN '자바스크립트의 메모리 관리')대상이 되었을 객체가, 
//클로저 패턴에서는 메모리 상에 남아 있게 됩니다. 
//외부 함수 스코프가 내부함수에 의해 언제든지 참조될 수 있기 때문입니다. 
//따라서 클로저를 남발할 경우 퍼포먼스 저하가 발생할 수도 있습니다. 
//자바스크립트는 가비지 컬렉션을 통해 메모리 관리를 합니다. 
//객체가 참조 대상이 아닐 때, 가비지 컬렉션에 의해 자동으로 메모리 할당이 해제됩니다

 

'학습' 카테고리의 다른 글

구조 분해 할당  (0) 2021.08.05
Spread / Rest 문법  (0) 2021.08.05
let vs const vs var  (0) 2021.08.04
원시 자료형 vs 참조 자료형  (0) 2021.08.04
CSS - Flexbox  (0) 2021.08.03