커링, curry, curryr

devjune·2021년 9월 26일

ES5

목록 보기
5/14

커링은 함수와 인자를 다루는 기법

function _curry(fn) {
  return function(a) {
    return function(b) {
      return fn(a, b);
    }
  }
}

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

var add10 = add(10);
console.log( add10(5) );
console.log( add(5)(3) );

curry 기법은 함수를 원하는 시점까지 미뤄 두었다가, 원하는 시점에 평가하는 기법

add(10, 5);

위 코드는 함수가 결과값으로 리턴된다.

add함수는 위 코드에서 return function(a) { 이렇게 하나의 인자만 받게 되므로 실행되지 않고 함수만 리턴한다.

즉시 실행이 가능하도록 하려면 curry 함수를 다음과 같이 변경하면 된다.

function _curry(fn) {
  return function(a, b) {
    if (arguments.length == 2) return fn(a, b);
    return function(b) {
      return fn(a, b);
    }
  }
}

//3항 연산자 이용
function _curry(fn) {
  return function(a, b) {
    return arguments.length == 2 ? fn(a, b) : function(b) { return fn(a, b); };
  }
}

var sub = _curry(function(a, b) {
  return a - b;
});

console.log( sub(10, 5) );

var sub10 = sub(10);
console.log( sub10(5) );

sub10 함수의 경우 10 - 5 표현이 아닌 5 - 10 같은 표현 같아 curryr이라는 함수를 만들어보기로 한다.

 function _curryr(fn) {
   return function(a, b) {
     return arguments.length == 2 ? fn(a, b) : function(b) { return fn(b, a); };
   }
 }

get()은 오브젝트에 있는 값을 안전하게 참조함에 의미를 둔다.

function _get(obj, key) {
  return obj === null ? undefined : obj[key];
}

var user1 = users[0];
console.log( user1.name );
console.log( _get(user1, 'name') );

console.log(  users[10].name ); //Cannot read property 'name' of undefined
console.log( _get(users[10], 'name') ); //undefined

curryr을 get 함수에 적용 시킨다면 다음과 같이 할 수 있다.

var get_name = _get('name');

console.log( get_name(user1) );
profile
개발자준

0개의 댓글