Currying vs Closure

Verba volant, scripta manent·2021년 1월 16일
0

JavaScript

목록 보기
17/20
post-thumbnail

Currying vs Closure

currying이란?

여러 개의 인자를 가진 함수를 호출 할 경우, 파라미터의 수보다 적은 수의 파라미터를 인자로 받으면 누락된 파라미터를 인자로 받는 기법
=> 함수 하나가 n개의 인자를 받는 과정을 n개의 함수로 각각의 인자를 받도록 하는 것

// 커링 함수
function add(a) {
// 클로저로 생성된 공간
  console.log(`a of add: ${a}`)
  return function(b) {
    console.log(`a: ${a} / b: ${b}`)
    return a + b
  }
}

add(1)(2) // 이 결과는 3이다.

add(1)이 실행되면 아래의 함수를 리턴한다.

function(b) {
    console.log(`a: ${a} / b: ${b}`)
    return a + b
  }

위의 함수 내에서 a는 1로 기억되고 add(1)의 결과를 바로 그 다음인 2 parameter와 함께 바로 실행하여 add(1)(2)는 3이 된 것이다.

왜 그런 것인가?
add(1)이 선언된 순간, 위의 함수가 리턴하는 익명함수는 클로저가 되었다.
익명함수에서는 a가 정의된 적은 없으나 클로저는 그 함수가 실행된 환경을 기억하고 있어 1을 기억하고 익명함수에 계속해서 a=1이라는 사실을 가지고 함수를 실행하게 된 것이다.

currying의 장점

재사용성이 가장 크다!
=>재사용성이 높을수록 생산성도 좋아지고 유지보수 할 때도 유용함

closure이란?

함수와 그 함수가 선언된 렉시컬 환경과의 조합이다.

let x = 1;

// outer 함수가 평가되어 함수 객체를 생성한다.
function outer() {
  let x = 10;
  let inner = function () {
    console.log(x); // 중첩 함수 inner가 평가된다.
  };
  return inner; // outer 함수를 호출하면 중첩 함수 inner를 반환한다.
}

let innerFunc = outer(); // outer 함수의 실행 컨텍스트는 실행 컨텍스트 스택에서 pop되어 제거된다.
innerFunc(); // 그러나 실행 결과는 10이다. (실행 컨텍스트 스택에서 제거된 outer 함수의 지역 변수 x의 값이 동작되었다.)

외부 함수보다 중첩 함수가 더 오래 유지되는 경우 중첩 함수는 이미 생명 주기가 종료한 외부 함수의 변수를 참조할 수 있다.

closure의 활용

상태를 안전하게 은닉하고 특정 함수에게만 상태 변경을 허용하기 위해 사용한다.

profile
말은 사라지지만 기록은 남는다

0개의 댓글