如果你可以假設你的函數的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,它會忽略負指數,因此調用回調並傳入「已完成」的值:
var args = [];
args[func.indexOf('done')] = done_callback;
func.apply(func, args);
真是巧妙的把戲。可能我會堅持這一點。感謝分享! – korCZis
@korCZis謝謝,沒有問題:) @ MSCDEX的答案是正確的,雖然,摩卡不會測試你的論點實際上是名爲'done',它只是檢查是否有至少'1'的說法,它不如果'Function.prototype.toString'已被覆蓋,則中斷。 – Paulpro