3

追加する前に何かが存在するかどうかを確認する簡単なシナリオがあります。存在する場合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
}

しかし、明らかにそうすることはreturnsだけ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
}

しかし、これは何度も繰り返すので、できるだけ簡潔にしたいと思います。

4

1 に答える 1

3

次のようなもので裏返しにすることができます:

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使用します。argumentse

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/

于 2013-09-01T05:21:22.850 に答える