자바스크립트에서 Currying을 사용하여 함수의 스코프를 어떻게 관리할 수 있나요?

Currying을 구현하기 위해서는 먼저 다음과 같이 함수를 작성해야 합니다.

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    } else {
      return function (...nextArgs) {
        return curried(...args, ...nextArgs);
      };
    }
  };
}

위의 코드는 curry 함수를 정의한 것입니다. 이 함수는 다른 함수를 인자로 받아 curried 함수를 반환합니다. curried 함수가 호출되면 인자를 체크하여 필요한 인자의 개수가 충족되면 받은 함수를 실행하고, 그렇지 않으면 다음 인자를 받는 새로운 curried 함수를 반환합니다.

예를 들어, 다음과 같이 add 함수를 currying할 수 있습니다.

function add(a, b) {
  return a + b;
}

const curriedAdd = curry(add);

console.log(curriedAdd(1, 2)); // 3
console.log(curriedAdd(1)(2)); // 3

add 함수를 curriedAdd로 curry하면, 인자를 하나만 받는 함수를 반환합니다. 이 반환된 함수에 다시 인자를 넣어 호출하면 curry한 함수를 실행하여 결과를 반환합니다. 이를 통해 스코프를 관리하면서 함수를 조합하여 사용할 수 있습니다.