2012-07-13 82 views
1

有什麼辦法比較javascript中的函數指針嗎?基本上,我想看看我是否已經多次將相同的函數添加到數組中,然後只添加一次。是的,我可以用它來編程,但這樣做會容易得多。在javascript中比較函數指針

下面的代碼不使用數組,但說明了我試圖做的一點。我希望oldPointer只能在myPointer是不同功能的情況下設置。

下面是一些示例代碼:

function test() 
{ 
} 


test.prototype.Loaded = function() 
{ 
    this.loaded = true; 
} 

test.prototype.Add = function(myPointer) 
{ 
    if (this.oldPointer != myPointer) //never the same 
    { 
     this.oldPointer = myPointer; 
    } 
} 

test.prototype.run = function() 
{ 
    this.Add(this.Loaded.bind(this)); 

    this.Add(this.Loaded.bind(this)); //this.oldPointer shouldn't be reassigned, but it is 
} 

var mytest = new test(); 
test.run(); 
+0

你能給出更多的僞代碼嗎?我不完全確定你在做什麼。陣列在哪裏?整個事情你都沒有數組。另外,爲什麼要聲明mytest,如果你只是要運行test.run()呢? – jcolebrand 2012-07-13 03:21:04

+0

陣列不是重點。上面的代碼說明了我想要做的事情。 – 2012-07-13 16:24:42

+0

我不同意。數組就是你想要的。你想確保你現在還沒有將它添加到數組中。無論如何,你有一個答案,所以我不會打擾小的實施細節。 – jcolebrand 2012-07-13 20:56:35

回答

2

假設綁定是一個函數,它使用Function.apply()來創建一個功能封閉綁定this的上下文,this.Loaded.bind(this)將生成一個新的函數,每次調用。這就是爲什麼你的代碼不起作用。不幸的是,沒有辦法從bind()產生的函數對象中引用this.Loaded,所以比較是不可能的。

如果你做了類似於下面的事情,你的支票可以工作,但我不確定它對你有多大的用處。

test.prototype.run = function() 
{ 
    var loadedFn = this.Loaded.bind(this); 
    this.Add(loadedFn); 

    this.Add(loadedFn); 
} 

如果您想要更好的答案,請明確說明您正在嘗試做什麼。

+0

'bind'已經存在於'Function'(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind)中,但無論如何你是對的。 – 2012-07-13 03:43:13

+0

糟糕,不知道Function.bind存在。很高興知道。謝謝。 – Yunchi 2012-07-13 03:54:19

+0

謝謝。每當它被調用時,我都不知道該綁定產生了一個新函數。但是,您的示例並不能解決我的問題,因爲在同一個函數中出現兩次的Add僅僅是爲了便於說明。如果我兩次打電話「跑步」會怎麼樣?基本上,無論運行被調用多少次,我都希望this.oldPointer只能分配一次。有任何想法嗎? – 2012-07-13 16:27:09

2

如果你的問題是「如何有效地避免增加相同功能的給定陣列兩次?」圍繞它進行編程的最簡單的方法顯然是:

// Add f to a if and only if it is not already in a 
if (a.indexOf(f) < 0) { 
    a.push(f); 
} 

如果indexOf線性複雜困擾你,而你只關心一個數組,你可以得到非常看中並存儲的事實功能加載在功能本身:

// Add f to a if and only if it is not already in a 
if (! f.alreadyAddedToA) { 
    a.push(f); 
    f.alreadyAddedToA = true; 
} 

爲hack屬性選擇任何名稱。

如果你有擔心的多重數組,你可以在函數內部存儲一種哈希表(在JS中使用合適的關鍵字破解對象)。

+0

js中的所有本地對象都是hashmaps – jcolebrand 2012-07-13 03:53:41

+0

難道這不就是在路上踢嗎? indexOf(f)在引擎蓋下使用==,所以如果==不起作用,indexOf將始終返回-1 – 2012-07-13 16:23:58

+0

第二個示例使用了works,但是ugh,還不是已經添加到了靜態?如果我這樣做,會怎麼樣? var test = new test();測試運行(); var test2 = new test(); test2.run();你的第二個例子不會失敗嗎? – 2012-07-13 16:28:53