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 回答