返回函数调用是否合适?

时间:2015-12-07 12:04:42

标签: javascript node.js

假设有一个名为foo的函数。我们将编写一个最后调用foo的函数,就像这样(注意这是一个真实的场景):

function update(string, callback) {
    if (arguments.count == 2) {
        if (typeof arguments[0] === 'string' && typeof arguments[1] === 'function') {
            updateRows(string, callback)
        } else {
            callback(Error('Invalid arguments.'))
        }
    } else if (arguments.count == 1) {
        if (typeof arguments[0] === 'function') {
            async.each(array, updateRows, callback)
        } else {
            callback(Error('Invalid arguments.'))
        }
    } else {
        callback(Error('Invalid arguments'))
    }
}

如您所见,错误处理程序回调被写入三次。

但是,我们可以使用return语句重构代码:

function update(string, callback) {
    if (arguments.count == 2) {
        if (typeof arguments[0] === 'string' && typeof arguments[1] === 'function') {
            return updateRows(string, callback)
        }
    } else if (arguments.count == 1) {
        if (typeof arguments[0] === 'function') {
            return async.each(array, updateRows, callback)
        }
    }

    callback(Error('Invalid arguments'))
}

现在代码比以前更清晰了。

因此,从函数返回函数是否​​合适,这是一个好习惯吗?我扫描了Ryan Dahl编写的一些代码块,没有任何后果。

如果没有对这两者进行基准测试,我认为不存在显着的性能差异。

编辑:当deceze警告我,我们没有返回函数,我们只是在返回语句中调用函数。在评论之后,我将问题标题更改为'返回函数调用'。如果它导致混淆,可以根据建议进行更新。

1 个答案:

答案 0 :(得分:1)

我不确定您的错误消息需要多少详细信息,如果您确实需要通过错误的方法使用发送错误消息,则可以抛出错误而不是在回调参数中返回错误。

如果您对任何事情使用回调,此回调应该返回有关执行内容的数据或错误,如果在回调之前出现错误,则必须在当前执行时发送此信息而不是等待另一个给你这个信息。

是的,你可以根据需要返回一个功能。

所以,这是一个非常简单的假设代码建议:

function foo () {
  var isArgumentsValid = typeof arguments[0] == "string" && typeof arguments[1] == "function";

  if ( isArgumentsValid) {  
    return function () {
      // do your code here here
    }
  }

  throw Error()

  return null;
}

// usage

foo("bar", function(){console.log('after foo task')})()