【问题标题】:jQuery.Callbacks - Removing anonymous function callbacksjQuery.Callbacks - 移除匿名函数回调
【发布时间】:2012-04-16 17:51:05
【问题描述】:

给$.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'

有没有办法克服这个问题?

【问题讨论】:

  • 函数由指针标识。您没有指向匿名函数的指针,因此您无需传递给remove() 来告诉它要删除哪个函数。简单地传递一个重复的函数是行不通的,因为重复的有一个不同的指针。您需要坚持将函数分配给变量,然后将该变量传递给remove()
  • 也许有一种方法可以检测匿名函数并为其分配一个变量。然后,在删除另一个匿名者时,检查它们是否相同?
  • 没有。它们永远不会相同,因为它们有不同的指针。
  • 还有没有办法比较这两个函数?也许有一些字符串化魔法? (去除空格等...)
  • $.Callbacks() 没有内置。您必须获取源代码并对其进行扩展。

标签: javascript jquery callback


【解决方案1】:

每个 OP 请求:

函数由指针标识。你没有指向你的匿名函数的指针,所以你没有任何东西可以传递给 remove() 来告诉它要删除哪个函数。简单地传递一个重复的函数是行不通的,因为重复的有一个不同的指针。您需要坚持将函数分配给变量,然后将该变量传递给 remove()。

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

【讨论】:

    【解决方案2】:

    尽管 arguments.callee 在“严格模式”下无效,但您可以使用 arguments.callee(对自身的引用)将其从函数本身(如函数的最后一行)中删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 2012-04-18
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      相关资源
      最近更新 更多