Javascript返回封闭函数

时间:2013-09-01 05:02:16

标签: javascript refactoring return dry decoupling

我有一个简单的场景,我在添加它之前检查是否存在某些内容,如果有,我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
}

但是,由于我重复了很多,我希望尽可能简洁。

1 个答案:

答案 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);
    };
}

演示:http://jsfiddle.net/ambiguous/3muzg/