Higher order function & closure

contability·2023년 9월 7일
0

고차함수(Higher Order Function)


함수의 형태로 리턴할 수 있는 함수.
함수를 인자로 전달 받을 수도 있고, 함수 자체를 리턴할 수 있다.

  1. 함수를 인자로 받는 경우
  const add = (num: number) => {
      return number++;
  }


  /**
   * 다른 함수를 인자로 받는 고차함수
   * @param func 현재 함수의 콜백 함수가 된다.
   * @returns 콜백 함수가 실행되고 그 결과가 반환된다.
   */
  const addNumber = (num: number, func: (num: number) => number) => {
      return func(num);
  }

  const result = addNumber(add, 1);
  console.log("result:",result);	// result: 2
  1. 함수를 리턴하는 경우(Curry Function)
  /**
   * 함수를 리턴하는 고차 함수
   * @param added 숫자
   * @returns 익명 함수가 반환된다. => 반환된 익명 함수는 다시 인자를 받고 합계를 반환한다.
   */
  const adder = (added: number) => {
  	return (num: number) => {
    	return num + added;
    }
  }

  // adder(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있다.
  const result53 = adder(5)(3);
  console.log(result53); // 5 + 3 -> 8

  // javascript에서 함수는 일급 객체이며 adder가 리턴하는 함수를 변수에 저장할 수 있다.
  const add3 = adder(3);
  const result32 = add3(2);
  console.log(result32); // 3 + 2 -> 5
  1. 함수를 인자로 받고(1) + 함수를 리턴하는 경우(2)
const double = (num: number) => {
	return num * 2;
}

function doubleAdder(added, func) {
  const doubled = func(added);
  return function (num) {
    return num + doubled;
  };
}

const doubleAdder = (added: number, func: (num: number) => number) => {
	const doubled = func(added);
    return (num: number) => {
    	return num + doubled;
    }
}

/*
 * 함수 doubleAdder는 고차 함수입니다.
 * 함수 doubleAdder의 인자 func는 함수 doubleAdder의 콜백 함수입니다.
 * 함수 double은 함수 doubleAdder의 콜백으로 전달되었습니다.
 */

// doubleAdder(5, double)는 함수이므로 함수 호출 기호 '()'를 사용할 수 있습니다.
doubleAdder(5, double)(3); // (5 * 2) + 3 -> 13

// doubleAdder가 리턴하는 함수를 변수에 저장할 수 있습니다. (일급 객체)
const addTwice3 = doubleAdder(3, double);
addTwice3(2); // (3 * 2) + 2 --> 8

Closure


내부 함수(클로저 함수)에서 외부 함수의 값을 사용하는 기법 또는 작동 원리

function outerFunc() {
  let outerVal = 2;
  function innerFunc() {
    let innerVal = 1;
    return globalVal + outerVal + innnerVal;
  }
  return innerVal;
}

const outerFunc = () => {
	const outerVal = 2;
    const innerFunc = () => {
    	const innerVal = 1;
        return globalVal + outerVal + innterVal;
    }
    return innerVal;
}

let globalVal = 3;
const innerF = outerFunc();
innerF();

0개의 댓글