Closure

Yiseul·2022년 1월 8일
0

조각지식

목록 보기
9/20

클로저란?
어떤 함수가 자신의 내부가 아닌 외부에서 선언된 변수에 접근하는 것
함수를 일급 객체로 취급하는 함수형 프로그래밍 언어(Functional Programming language: 얼랭(Erlnag), 스칼라(Scala), 하스켈(Haskell), 리스프(Lisp)…)에서 사용되는 중요한 특성

클로저의 특징
클로저를 활용하면 어떤 함수 내부에서만 사용되는 일회성 함수(정의 후 바로 호출되는)의 매개 변수를 생략할 수 있다.

클로저의 부작용
과용하거나 오용하게 되면 오히려 코드 품질 측면에서 부정적인 영향을 미칠 수 있다. 클로저가 많아지게 되면 코드가 읽거나 고치기가 어려워지고 버그가 발생하기 쉬워지기 때문. 이러한 버그는 비동기 때 발생할 확률이 높아진다.

let rate = 1113.5;

function printRate() {
  setTimeout(() => console.log(`현재 미달러 환율은 ${rate}원 입니다.`), 1000);
}

printRate(); // 현재 미달러 환율은 500원 입니다.

rate = 100;
printRate(); // 현재 미달러 환율은 500원 입니다.

rate = 500;
printRate(); // 현재 미달러 환율은 500원 입니다.

// 프로그램을 실행해보면, rate 변수에 중간에 할당된 값은 무시되고 제일 마지막에 할당한 값이 계속해서 출력되는 것을 볼 수 있는데요. setTimeout() 함수 때문에 콘솔에 출력되는 시점이 1초씩 지연되기 때문에 발생하는 현상입니다.

클로저 피하기

let rate = 1113.5;

const convertUsdToKrw = (dollar) => dollar * rate;

function batchConvertUsdToKrw(dollars) {
  return dollars.map(convertUsdToKrw);
}

내부에서 정의된 함수를 외부로 빼면 이 함수에 대해서도 단위 테스트를 작성할 수 있으며, 이 함수는 batchConvertUsdToKrw() 함수를 벗어나 다른 곳에서도 호출이 가능해진다. (이 부분은 상황에 따라서 장점이 될 수고 있고 단점이 될 수도 있다.)

function batchConvertUsdToKrw(dollars, rate) {
  const convertUsdToKrw = (dollar) => dollar * rate;
  return dollars.map(convertUsdToKrw);
}

// 아예 rate를 batchConvertUsdToKrw() 함수의 매개 변수로 넣어주면, rate 변수의 값이 외부에서 수정될 수 있는 문제를 근본적으로 예방할 수 있다. 대신 batchConvertUsdToKrw() 함수를 호출할 때 항상 명시적으로 rate인자값을 줘야한다.

> batchConvertUsdToKrw([1, 5], 1113.5)
[ 1113.5, 5567.5 ]
> batchConvertUsdToKrw([1, 5], 100)
[ 100, 500 ]

https://www.daleseo.com/js-closures/
https://poiemaweb.com/js-closure

profile
즐거운 도전중입니다:)

0개의 댓글