5

有谁知道如何销毁 javascript (jquery) 函数?我正在使用 jquery “selectable”,并且在可选择的“stop”事件上触发函数调用“edit”。

在这个“编辑”函数中,我嵌套了带有很多“点击”事件的开关函数,并且每个“点击”事件中有很多函数。我的问题是,每次我触发功能“编辑”中的“可选”功能和事件时,都会再次触发,但之前的功能和事件仍然存在。我现在要做的是在可选择的“开始”上取消绑定功能“编辑”中的每个事件。

这是内存泄漏问题吗?有没有办法在 javascript 中“销毁”函数?我试图在函数结束时将函数声明为 null,但这不起作用。它里面的功能和事件仍然存在。

有人有线索吗?

演示页面在这里 --> http://dreamerscorp.com/test/test01/javascript_destory_test.html

编辑 2009/10/31 :) 非常感谢您的帮助,您的评论对我非常有用,再次感谢!!!

4

4 回答 4

13

您可以尝试使该函数无效,或覆盖它,分配一个不执行任何操作的匿名函数:

myFunction = null;
// or 
myFunction = function () {};

您也可以在函数本身内执行此操作:

var autoDestroy = function () {
  autoDestroy = null;
  //...
  return 1;
};

autoDestroy(); // returns 1
autoDestroy(); // TypeError: autoDestroy is not a function
于 2009-10-30T04:14:46.923 回答
6

在 jquery 中取消绑定事件使用 unbind 函数http://docs.jquery.com/Events/unbind

$("something").click(function() {
    $("anotherOne").click(function() {
         ....
    });
});

在此示例中,每次单击“某物”时,都会为“anotherOne”添加一个事件处理程序,因此如果单击 3 次,将获得三个事件处理程序。

$("something").click(function() {
    $("anotherOne").unbind('click').click(function() {
         ....
    });
});

在这里,您保证在“anotherOne”上只有一个点击处理程序。

无需显式销毁先前的处理程序。

于 2009-10-30T08:41:09.443 回答
5

基本上,您需要删除对这些函数的所有引用,以便 JavaScript 垃圾收集器可以收集它们。如果它们被绑定,您需要解除它们的绑定。如果那里有其他变量指向它们,则需要将它们设置为 null。

如果您发布一些代码可能会有所帮助;那么我们可以给出更好的答案。

...编辑:

这里发生的是,您正在创建一个比包含函数寿命更长的闭包:

    function edit(){
      $('.edit').click(function(){
        //...
        function _edit(boxTitle,selectedItemAmount){
          //...
          $('#box .yes').click(function(){
            alert(boxTitle + ' for ' + selectedItemAmount + ' selected item');
            $('#msg').hide(); // hide msg box when yes btn is clicked
          });
        }
        //...
        $('#box .no').click(function(){
          $('#msg').hide();
        });
      });

换句话说,在一个函数内部,你说“将这个函数附加到一个 DOM 对象”,而你是在内联的。JavaScript 从外部上下文中捕获变量,并在对内部上下文的引用处于活动状态时使它们保持活动状态。

您需要做的是在非内联的地方定义函数,然后使用它们:

    function boxClickYes(e) {
      alert(e.data.boxTitle + ' for ' + e.data.selectedItemAmount +
        ' selected item');
      $('#msg').hide(); // hide msg box when yes btn is clicked
    }
    function boxClickNo(e) {
      $('#msg').hide();
    }
    function edit(){
      $('.edit').click(function(){
        //...
        function _edit(boxTitle,selectedItemAmount){
          //...
          $('#box .yes').bind("click", {boxTitle: boxTitle,
            selectedItemAmount: selectedItemAmount}, boxClickYes);
        }
        //...
        $('#box .no').click(boxClickNo);
      });

这还演示了如何使用 jQuery click 处理程序中的 data 属性在附加处理程序和使用它的时间之间存储数据(而不是将数据存储在将作用域链保留在内存中的闭包中)。当您只是在那里使用它时(例如 a 的主体$.each),使用内联定义的函数很好,但是当您附加事件处理程序时就不行了。

于 2009-10-30T04:21:52.317 回答
1

要在 javascript 中“销毁”一个函数,只需确保该函数变得无法访问即可。这将使该函数有资格进行回收。需要注意的一件事是,javascript 变量是基于范围绑定的(而不是作为单个变量),如果将绑定保留在范围内,则具有许多未使用对象的范围可能会持续存在: 提供更多帮助需要了解具体代码及其使用方式。

请参阅 javascript 删除运算符作为删除变量或对象成员的一种方法。将值设置为 null/undefined/other-object 会删除到达先前引用的对象的方法(尽管它可能仍然可以访问,因此不会被回收),但不会删除变量/成员。

delete variable
delete obj.member
delete obj[member]
于 2009-10-30T04:51:44.073 回答