重复回调函数的最佳实践?

时间:2012-11-17 16:17:40

标签: javascript jquery function callback dry

在我的代码中,我使用了很多(命名的)回调函数,只是为了给出一个简单的例子:

function showThis(callback) {

  // Do something

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

}

现在我在不同的函数中重复这个模式(我在谈论回调部分),如果我创建一个通用的回调处理函数并包含它,它会被认为更好吗?

类似的东西:

function doCallback(callback) {

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

}

function showThis(callback) {

  // Do something

  doCallback(callback);
}

我认为保持代码DRY更好,但我不确定。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

在我看来,没有必要拥有一个回调处理程序。在不同情况下,您可能需要使用不同的上下文调用回调(例如callback.call(ob...callback.apply(obj...)。所以你需要一个额外的回调处理程序参数(上下文)。另一件不太令人愉快的事情是你可能需要将自定义参数传递给回调。使用回调处理程序,您可以通过将所有参数传递到数组并在其上应用函数来减轻痛苦。像......这样的东西:

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

但是有这么多可选参数...... 另一件事是你正在做的检查:

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

实际上不是必需的,这就足够了:typeof callback === 'function'

只有当false评估为callback时,第一个条件才会返回false,但如果评估为false typeof callback则不会返回function 。所以条件很短。

这就是为什么我认为你不需要回调处理程序。顺便问一下我喜欢这样的话题! : - )

答案 1 :(得分:3)

是的,这可能是一个好主意。就像你说的那样,它避免重复你自己,并且它的意图非常明确。虽然您确实无法访问showThis范围内的变量,但无论如何都会丢失,因为那里没有定义callback,所以没有什么可担心的。