첫 번째 방법은 클로저를 사용하는 것입니다. 클로저는 함수와 그 함수가 선언된 렉시컬 환경(Lexical Environment)인 스코프를 함께 기억하는 개념입니다. 아래의 예제 코드를 통해 Currying을 구현하는 방법을 살펴보겠습니다.
function add(a) {
return function(b) {
return a + b;
}
}
const addTwo = add(2);
console.log(addTwo(3)); // 5
console.log(addTwo(5)); // 7
위의 코드에서 add
함수는 인자 a
를 받고, 내부 함수를 반환합니다. 반환된 내부 함수는 인자 b
를 받고, a
와 b
를 더한 값을 반환합니다. add
함수를 호출하여 addTwo
를 만들면, addTwo
는 인자 b
만을 받는 함수가 되는 것입니다. 이렇게 사용하면 addTwo
는 항상 2
를 첫 번째 파라미터로 전달하여 덧셈 연산을 수행합니다.
다른 방법으로는 bind
메소드를 이용하는 방법이 있습니다. bind
메소드는 함수에 대한 새로운 this 값을 설정하고, 필요한 인수를 미리 넣을 수 있도록 해줍니다. 아래의 예제 코드를 통해 bind
메소드를 사용한 Currying을 살펴보겠습니다.
function multiply(a, b) {
return a * b;
}
const multiplyByTwo = multiply.bind(null, 2);
console.log(multiplyByTwo(3)); // 6
console.log(multiplyByTwo(5)); // 10
위의 코드에서 multiply
함수를 bind
메소드를 사용하여 multiplyByTwo
함수를 만들었습니다. bind
메소드의 첫 번째 인자인 null
은 this 값을 설정하는 것이므로, 여기서는 필요하지 않았기 때문에 null
을 전달했습니다. 두 번째 인자인 2
는 미리 multiply
함수의 첫 번째 파라미터로 넘겨지기 때문에, multiplyByTwo
함수는 두 번째 파라미터만 받게 됩니다.
Currying은 함수의 재사용성과 가독성을 높이는데 도움을 줄 수 있습니다. 함수를 필요한 순서로 호출하는 것이 아니라, 각각 다른 함수로 나누어 조합하여 사용할 수 있기 때문에 여러 상황에 적용하기 쉽습니다.