2012-04-16 53 views
1

添加的回調函數,$ .Callbacks()後,我想再次將其刪除:jQuery.Callbacks - 刪除匿名函數回調

var callbacks = $.Callbacks(), 
    foo = function() { console.log('Hello world') }; 

callbacks.add(foo); 
callbacks.fire(); // logs 'Hello world' 
callbacks.remove(foo); 
callbacks.fire(); // nothing to trigger, removed perfectly 

所以,這工作,但現在我要添加一個匿名函數,像這樣:

callbacks.add(function(){ console.log('Hello anonymous world') }); 
callbacks.fire(); // logs 'Hello anonymous world' 

看起來不錯,但我不能再刪除功能:

callbacks.remove(function(){ console.log('Hello anonymous world') }); 
callbacks.remove(); 

callbacks.fire(); // still logs 'Hello anonymous world' 

有沒有辦法解決這個問題?

+0

函數由指針標識。你沒有指向匿名函數的指針,所以你沒有任何東西可以傳遞給'remove()'來告訴它要刪除哪個函數。簡單地傳遞一個重複的函數不會這樣做,因爲重複函數有一個不同的指針。您需要堅持將該函數分配給一個變量,然後將該變量傳遞給remove()。 – 2012-04-16 17:54:29

+0

也許有一種方法來檢測匿名函數併爲其分配一個變量。然後,當刪除另一個匿名者時,檢查它們是否相同? – Kriem 2012-04-16 17:56:21

+0

不,他們永遠不會是一樣的,因爲他們有不同的指針。 – 2012-04-16 17:59:48

回答

3

每個操作請求:

功能由指針確定的。你沒有指向你的匿名函數的指針,所以你沒有任何東西可以傳遞給remove()來告訴它要刪除哪個函數。簡單地傳遞一個重複的函數不會這樣做,因爲重複函數有一個不同的指針。您需要堅持將該函數分配給一個變量,然後將該變量傳遞給remove()。

參考:http://api.jquery.com/category/callbacks-object/

0

你可以從你的函數內部將其刪除(如在函數的最後一行)使用arguments.callee的(對自身的引用),雖然是arguments.callee是不是在「嚴格有效模式'。