본문 바로가기

JavaScript/공부공부

[JS] 고차함수 (2) closure, currying

 

[ 고차함수 (Higher-order function) ]

함수형 프로그래밍에서 다른 함수를 인자로 받거나, 함수를 결과로 반환하는 함수. (추상화)

 


 

[ 결과를 함수로 반환하는 고차함수 ]

ex) 클로저(closure), 커링(currying)

 

[ Closure ]

함수와 함수가 선언될 때의 렉시컬 환경(Lexical Environment)의 조합.

=> 함수가 자신이 생성될 때의 환경을 기억.

function makeCounter() {
    let count = 0;

    return function() {
        return count++;  // 내부 함수가 외부 함수의 `count` 변수를 참조
    };
}

let counter1 = makeCounter();		
console.log(counter1()); // 출력: 0
console.log(counter1()); // 출력: 1

let counter2 = makeCounter();
console.log(counter2()); // 출력: 0
console.log(counter2()); // 출력: 1

=> 외부함수 makeCounter() 를 호출하고 반환된 내부함수를 counter1 & counter2 에 저장.

counter1 & counter2 를 호출하면 내부함수의 반환값인 count++ 를 반환.


외부함수의 실행이 종료된 이후에도 내부함수는 외부함수의 변수인 'count'에 접근 가능하기 때문에 

계속해서 ++가 적용된 count값을 사용할 수 있다.

* 외부함수를 호출할 때마다 새로운 클로저가 생성 => counter1과 counter2 는 독립된 클로저 함수. 

 


 

[ Currying ]

여러개(n)의 인자를 가진 함수를 단계적으로 하나의 인자만 받는 함수로 변환. 

(각 단계별로 클로저를 생성하여 다음 인자를 받을 수 있는 새로운 함수를 반환)

function multiply(a, b) {
  return a * b;
}

function curryMultiply(a) {
  return function(b) {
    return multiply(a, b);
  };
}

console.log(curryMultiply(2)(5));  // 출력: 10

const double = curryMultiply(2);
console.log(double(5));  // 출력: 10

=>  curryMultiply(a) 함수는 첫번째 인수 'a'만 받아 생성된 클로저를 double에 저장. ('a'를 기억)

double은 'b'값이 주어지면 multiply(2, b)를 실행하여 최종 결과를 반환.


curryMultiply 함수는 2개의 인자를 받는 함수인 multiply를 커링하여 1개의 인자만 받는 새로운 함수 double(클로저)로 변환하는 역할을 한다. 함수의 유연성 증가!!  


화살표 함수로 표현하면 아래와 같다.

const curryMultiply = (a) => (b) => a * b;

 


 

[참고블로그]

https://velog.io/@2ast/JS-%ED%81%B4%EB%A1%9C%EC%A0%80%EC%99%80-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98

 

JS) 내가 이해한 클로저와 커링

MDN에서 클로저의 정의를 보면 다음과 같이 설명하고 있다."클로저는 함수와 함수가 선언된 어휘적 환경의 조합이다."쉽게 말해서 클로저란 함수가 선언되었을 때, 선언된 시점의 환경을 기억한

velog.io