我有以下形式的代碼,用戶可以指定一個回調,這將在以後的時間被稱爲:將兩個匿名函數解析爲相同的定義點?
var _deferred = [];
var deferred = function(callback) {
_deferred.push(callback);
}
var doDeferred = function() {
for(var i = 0, max = _deferred.length; i < max; i++) {
_deferred[i].call();
}
}
for(var i = 0; i < 5; i++) {
deferred(function() {
console.log("Some deferred stuff");
});
}
doDeferred();
我想認識到指定的遞延()回調是一個匿名函數解決相同的來源,只允許它被添加一次。阿卡在for循環,將拋出一個異常底部當i = 1
像:
var deferred = function(callback) {
if(_deferred.indexOf(callback) !== -1) {
throw "Already added!";
}
_deferred.push(callback);
}
我能想到的加入了「鑰匙」這樣做的方法很多,但我想知道如果我可以沿着Function.caller的行來創建一個「源哈希」?
有沒有解決方案已經有,我沒有看到?我真的更願意接受這個負擔,而不是推遲給延遲的調用者,讓他們提供某種獨特的ID。
編輯:
澄清任何混淆。
是的每個延期調用都有一個唯一的函數對象,有自己的閉包等,因此我的indexOf總是失敗。這不是一個混亂點。
問題是,這些匿名函數是在同一個地方聲明的,它們是相同的代碼,我怎麼能確定?我正在尋找確定聲明的平等,而不是實例平等。我想我能以某種方式創建基於遞延呼叫者的哈希...
結論:
謝謝你們,好像也沒有真正優雅的解決方案在這裏。 toString方法不是確定性的(具有相同主體的不同函數將作爲字符串進行測試),並且只是非常難看。我要把這個負擔放在呼叫者身上。
你的'indexOf'方法有什麼問題? 「解決同一來源」究竟是什麼意思? – davin
嗯,它不會拋出異常:) – amirpc
它不會拋出異常,因爲它是內存中的一個不同的函數 – Robert