일등함수 살펴보기

Donghun Seol·2023년 3월 31일
0

콜백함수

함수가 일등함수인 환경에서는 함수는 일종의 값이다. 따라서 변수, 다른함수의 매개변수로 함수를 전달할 수 있다.

const f = (callback: () => void): void => callback();

const init = (callback: () => void): void => {
  console.log('default init fin');
  callback();
  console.log('all init fin');
};

init(() => console.log('custom init in progress'));

// 프로그램의 전체 구조를 쉽게 작성할 수 있게 설계된 라이브러리를 프레임워크라 한다.
// 여러 프로그램이 공통으로 구현해야할 함수를 API라는 이름으로 제공한다.
// API는 새로운 내용을 손쉽게 추가할 수 있게 구현되어야 하는데,
// 이러한 특성 콜백함수를 통해 쉽게 구현할 수 있다.

중첩함수

또한 함수는 변수에 담긴 함수 표현식이므로 함수 안에 다른 함수를 중첩(nested)할 수 있다.

const calc = (value: number, cb: (num: number) => void): void => {
  let add = (a: number, b: number): number => a + b;
  function multiply(a: number, b: number) {
    return a * b;
  }
  let result = multiply(add(1, 2), value);
  cb(result);
};

calc(30, (result: number) => console.log(`${result} is result`));

고차함수와 클로저

add1은 단순한 형태의 함수이다. 확장와 기능추가가 어렵다.
add2는 고차함수로 선언되어 커스터마이즈 가능하다.

const add1 = (a: number, b: number): number => a + b;

const add2 =
  (a: number): ((a: number) => number) =>
  (b: number): number =>
    a + b;

console.log(add1(1, 2));
console.log(add2(1)(2));

어떻게 고차함수로 적용하는지 한눈에 파악하기 어려우므로 단계적으로 변환해서 이해하면 좀 더 쉽다.

일단 반환하는 함수 타입을 선언한다.
add3의 반환값은 함수이므로 선언된 함수 타입을 반환값으로 지정한다.
내부에 함수 표현식을 담는 _add변수를 선언해서 NumberToNumberFunc 타입에 맞는 함수를 담는다.
_add를 반환한다. 지정한 외부함수의 타입과 일치하므로 오류가 없다.

이후 불필요한 변수 선언을 return문에 합치고, 화살표 함수의 인라인 리턴형식을 적용하면 깔끔하게 리팩토링된다. 위와 같이 일견 난해하지만 심플한 고차함수를 만들 수 있다.

또한 _add 함수에서 자신의 바깥 스코프의 변수 a를 사용하므로, 클로저가 형성되었다.

type NumberToNumberFunc = (a: number) => number;

const add3 = (a: number): NumberToNumberFunc => {
  const _add: NumberToNumberFunc = (b: number): number => a + b; // 클로저
  return _add
};


const add3 =
  (a: number): NumberToNumberFunc =>
  (b: number): number =>
    a + b;
profile
I'm going from failure to failure without losing enthusiasm

0개의 댓글