3

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

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);
}

我认为最好保持代码干燥,但我不确定。任何帮助是极大的赞赏!

4

2 回答 2

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。所以条件足够短。

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

于 2012-11-17T16:23:26.580 回答
3

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

于 2012-11-17T16:20:12.860 回答