我有一个简单的场景,我在添加它之前检查是否存在某些内容,如果有,我return
函数(因此退出)。我多次使用这个模式,我想在另一个简单的函数中将它解耦。
function onEvent(e){
if( this.has(e) )
return
this.add(e);
// More logic different on an event-basis
}
我想像这样解耦:
function safeAdd(e){
if( this.has(e) )
return
this.add(e);
}
function onEvent(e){
safeAdd(e);
// More logic
}
但显然这样做return
s safeAdd
并且不会退出onEvent
,其余的逻辑仍会被执行。
我知道我可以这样做:
function safeAdd(e){
if( this.has(e) )
return false
this.add(e);
return true
}
function onEvent(e){
if( !safeAdd(e) )
return
// More logic
}
但是,由于我重复了很多,我希望尽可能简洁。
答案 0 :(得分:2)
你可以用这样的东西把它翻出来:
function safeAdd(callback) {
return function(e) {
if(this.has(e))
return false;
this.add(e);
return callback.call(this, e);
};
}
然后你可以做这样的事情:
var obj = {
onEvent: safeAdd(function(e) {
console.log('more logic', e);
}),
onPancakes: safeAdd(function(e) {
console.log('pancakes', e);
}),
has: function(e) { /* ... */ },
add: function(e) { /* ... */ }
};
演示:http://jsfiddle.net/ambiguous/T6pBQ/
如果您需要在函数中支持更多参数,请将call
切换为apply
并使用arguments
代替e
:
function safeAdd(callback) {
return function() {
if(this.has(arguments[0]))
return false;
this.add(arguments[0]);
return callback.apply(this, arguments);
};
}