2012-04-16 54 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是不是在“严格有效模式'。