커링은 함수와 인자를 다루는 기법
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) );