6

次のコードを検討してください。

function foo(handlers) {
  callSomeFunction(handlers.onSuccess, handlers.onFailure);
}

呼び出し元は次のことを行うことができます。

foo({onSuccess: doSomething, onFailure: doSomethingElse });

または単に

foo()

特に何もすることがない場合。

上記のコードの問題は、上記の単純な foo() 呼び出しのように「ハンドラー」が定義されていない場合、callSomeFunction(handlers.onSuccess, handlers.onFailure) の実行中に実行時例外がスローされることです。

このような状況を処理するために、foo 関数を次のように書き直すことができます。

function foo(handlers) {
  var _handlers = handlers || {};
  callSomeFunction(_handlers.onSuccess, _handlers.onFailure);
}

またはより構造化された

function safe(o) {
  return o === Object(o) ? o : {};
}

function foo(handlers) {
  callSomeFunction(safe(handlers).onSuccess, safe(handlers).onFailure);
}

sugarjs や underscore などのライブラリで safe() 関数のようなものを見つけようとしましたが、何も見つかりませんでした。私は何か見落としてますか?同様の機能を持つ他のユーティリティ ライブラリはありますか?

車輪を再発明しないようにしています... ;)

BR、エイドリアン。

PS上記のコードはテストしていないため、エラーがある可能性があります。

4

1 に答える 1

2

jQuery にもよく似たものがあります。これは、プラグイン開発を扱うときによく使用されるjQuery.extendです。

function foo(options){
    var defaults = {onSuccess: someFunction, onFailure: someOtherStuff}
    var options = $.extend({}, defaults, options); 
}

この場合、ユーザーはオプションの任意のサブセットを提供でき、関数は関数呼び出しで提供されていないオプションのデフォルトを追加できるため、理にかなっています。

于 2012-10-23T00:26:47.817 に答える