【问题标题】:library function for safe property reference on javascript objects用于对 javascript 对象进行安全属性引用的库函数
【发布时间】: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


【解决方案1】:

在 jQuery 中有一些非常相似的东西,在处理插件开发时经常使用 jQuery.extend:

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

在这种情况下,这是有意义的,因为用户可以提供任意选项子集,并且函数会为函数调用中未提供的选项添加默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2013-03-13
    相关资源
    最近更新 更多