假设有一个名为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警告我,我们没有返回函数,我们只是在返回语句中调用函数。在评论之后,我将问题标题更改为'返回函数调用'。如果它导致混淆,可以根据建议进行更新。
答案 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')})()