如果您可以假设您的函数的toString 没有被覆盖,您可以在用户定义的函数上使用它来检查它是否有一个名为done 的参数,例如:
function argIndexOf(f, arg) {
var s = f + '';
return s.substring(s.indexOf('(') + 1, s.indexOf(')'))
.replace(/\s+/g, '').split(',').indexOf(arg);
}
argIndexOf(function(){}, 'done'); // -1
argIndexOf(function(done){}, 'done') // 0
argIndexOf(function(arg1, done){}, 'done') // 1
该函数将接收一个函数作为参数并返回它的位置 done 参数,或者 -1 如果没有参数。它使用Array.prototype.indexOf,如果您想在 IE 8 或更早版本中使用它,则需要为shimmed。您已将问题标记为 node.js,因此我认为这不是问题。
您甚至可以将其添加到 Function.prototype 中,但如果您希望您的代码与其他代码很好地配合使用,则非常不鼓励这样做:
Function.prototype.indexOf = Function.prototype.indexOf || function(arg) {
var s = this + '';
return s.substring(s.indexOf('(') + 1, s.indexOf(')'))
.replace(/\s+/g, '').split(',').indexOf(arg);
};
那么你可以使用:
func.indexOf('done')
你也可以使用apply,它会忽略负数索引,所以调用回调并传入一个'done'的值:
var args = [];
args[func.indexOf('done')] = done_callback;
func.apply(func, args);