보통의 함수는 다음과 같이 사용한다.

const greet = (greeting, name) => {
  console.log(`${greeting} ${name}`);
}

greet('Hi', 'Tony');
greet('Hi', 'John');
greet('Hi', 'Tina');

 

함수를 연속해서 반환하는 커링(Currying)를 사용하면 다음과 같은 것이 가능해진다.

const curry = function(greeting) {
  return function(name) {
    console.log(`${greeting} ${name}`);
  }
}

const curriedGreet = curry('Hi');

curriedGreet('Tony');
curriedGreet('John');
curriedGreet('Tina');

이는 렉시컬 환경과 클로저에 의해 가능하다.

  1. const curriedGreet = curry('Hi'); 을 통해서 변수가 ‘Hi’로 정의된 렉시컬 환경을 갖는 클로저가 생성된다.
  2. curredGreet(’…’); 은 기존에 생성된 curredGreet의 클로저를 통해 실행된다.
    • greeting 변수와 name 변수가 사용되는데, greeting 변수는 curry(’Hi’) 에서 생성된 렉시컬 환경에서, name 변수는 curredGreet()을 호출하며 사용되는 파라미터로 사용된다.

 

위의 코드는 아래와 같이 간결하게 작성할 수 있다.

const curry = greeting => name => {
  console.log(`${greeting} ${name}`);
};

+ Recent posts