【发布时间】:2012-10-12 09:33:30
【问题描述】:
考虑以下代码:
function foo(handlers) {
callSomeFunction(handlers.onSuccess, handlers.onFailure);
}
调用者可能会这样做:
foo({onSuccess: doSomething, onFailure: doSomethingElse });
或者只是
foo()
如果她/他没有什么特别的事情要做。
上面代码的问题是,如果 'handlers' 没有定义,就像上面简单的 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, 阿德里安。
附:上面的代码我没有测试,可能有错误。
【问题讨论】:
-
var _handlers = handlers || {};足以用于默认参数。不需要图书馆。 -
我不能完全确定这是否是一个有效的问题......但不管怎样,你为什么要一个库来存储你已经证明你可以用一行代码实现的东西?
-
if(!handlers)handlers={}或handlers=handlers||{}太常见了,而且和使用库函数handlers=safe(handlers)一样短——没必要 -
检查this。答案提供了几种方法以及一些最佳实践。
-
@jbabey 这是要添加到每个函数(如 foo())的额外代码行
标签: javascript