3

私のコードでは、簡単な例を示すために、多くの (名前付きの) コールバック関数を使用しています。

function showThis(callback) {

  // Do something

  if (callback && typeof(callback) === 'function') {
    callback();
  }

}

今、私はこのパターンをさまざまな関数で繰り返しています (コールバック部分について話している) ので、1 つの汎用コールバック ハンドラー関数を作成してそれを含めた方が良いと考えられますか?

何かのようなもの:

function doCallback(callback) {

  if (callback && typeof(callback) === 'function') {
    callback();
  }

}

function showThis(callback) {

  // Do something

  doCallback(callback);
}

コードを DRY にしておく方が良いと思いますが、よくわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

4

私の意見では、コールバック ハンドラを用意する必要はありません。さまざまな状況で、さまざまなコンテキストでコールバックを呼び出す必要がある場合があります (たとえばcallback.call(ob...、 またはcallback.apply(obj...)。そのため、コールバック ハンドラ (コンテキスト) の追加パラメータが必要になります。あまり好ましくないもう 1 つの点は、カスタム引数をコールバックに渡す必要がある場合があることです。コールバック ハンドラーを使用すると、すべてのパラメーターを配列に渡し、それらに関数を適用することで、負担を軽減できます。何かのようなもの...:

function callbackHandler(callback, arguments, context) {
    if (typeof callback === 'function') {
        return callback.apply(context, arguments);
    }
    return null;
}

しかし、非常に多くのオプションのパラメーターがあります...もう1つのことは、あなたが行っているチェックです:

if (callback && typeof callback === 'function') //notice that typeof is an operator not a function, so you don't need parentless

実際には必要ありません。これで十分です。typeof callback === 'function'

最初の条件は、が評価された場合にfalseのみ返されますが、評価された場合は返されません。したがって、条件は十分に短いです。callbackfalsefalse typeof callbackfunction

そのため、コールバック ハンドラは必要ないと思います。ところで、私はそのようなトピックが大好きです。:-)

于 2012-11-17T16:23:26.580 に答える
3

はい、それは良い考えかもしれません。あなたが言ったように、それは自分自身を繰り返すことを避け、その意図については完全に明確です. スコープ内にあった変数へのアクセスを失うことはありshowThisますが、そこで定義されていないため、とにかくそれを失っていたのでcallback、心配する必要はありません.

于 2012-11-17T16:20:12.860 に答える