var hi = _.once(function(){
console.log('hi');
});
hi();
// hi
hi();
// 아무 일도 일어나지 않음
function skip(body){
var yes;
return function(){
return yes || (yes = body.apply(null,arguments));
}
}
기본적인 _.partial 함수 사용법
var pc = _.partial(console.log,1);
pc(2);
// 1 2
var pc = _.partial(console.log,_,2);
pc(1);
// 1 2
pc(1,3);
// 1 2 3
var pc = _.partial(console.log,_,_,3);
pc(1);
// 1 undefined 3
pc(1,2);
// 1 2 3
pc(1,2,4);
// 1 2 3 4
var add_all = _.partial(_.reduce,_,function(a,b){ return a+b });
add_all([1,2,3,4]);
// 10
_.compose(
console.log,
function(a){return a-2;},
function(a){return a+5;}
)(0);
// 0+5 -> 5-2 -> console.log
// 3
var falsy_value = _.compose(
_.partial(_.isEqual,-1),
_.partial(_.findIndex,_,_.identity)
);
console.log(falsy_value([1,true,{}]));
// false
console.log(falsy_value([0,1,false]));
// false
console.log(falsy_value([0,"",false]));
// true
var every = _.compose(
_.partial(_.isEqual,-1),
_.partial(_.findIndex,_,_.negate(_.identity))
);
console.log(every([1,true,{}]));
// true
console.log(every([0,1,false]));
// false
console.log(every([0,"",false]));
// false
파이프라인은 .compose의 장점을 그대로 가진다.
.compose와 기본적인 사용법은 동일하나 실행 방향이 왼쪽에서 오른쪽, 위에서 아래로 표현된다.
// 마이클 포거스의 _.pipeline
_.pipeline = function(){
var funs = arguments;
return function(seed){
return _.reduce(funs,
function(l,r){ return r(l);},
seed);
};
};
var div_square = _.pipeline(
function(a){
return a / 2;
},
function(a){
return a * a;
}
);
console.log(div_square(6));
// 9
_.pipeline은 작은 함수들을 모아 큰 함수를 만드는 함수
파이프라인은 클래스와 비슷한 역할을 대신할 수 있다.
var users = [];
var companies = [];
function joined_at(attrs){
return _.extend(attrs,{joined_at: new Date()});
}
function greeting(member){
return member.name + "회원님은 " + member.id + "번째 회원이십니다. 환영합니다.";
}
var join_user = _.pipeline(
joined_at,
function(member){
users.push(member);
member.id = users.length;
return member;
},
greeting
);
var join_company = _.pipeline(
joined_at,
function(member){
companies.push(member);
member.id = users.length;
return member;
},
greeting
);
위에서 설명했던 마이클 포거스의 .pipeline은 Multiple Results를 지원하지 않고, 파이프라인의 내부 함수에서 this를 사용할 수 없다.
Partial.js의 파이프라인 함수 .pipe는 Multiple Results와 this를 지원한다.
//정의 후 call을 통한 실행
_.pipe(
function(){
return this.a;
},
console.log,
function(){
this.b = 2;
return this;
},
console.log
).call({a:1});
var obj = {
a: 10,
method1: _.pipe(
function(){
return this.a;
},
console.log,
function(){
this.b = 2;
return this;
},
console.log
)
};
obj.method1();
.go는 .pipe의 즉시 실행 버전이다.
_.go(10,
function(a){ return a / 2},
function(a){ return a + 2},
console.log);
// 7