在javascript(jquery)中销毁一个函数

时间:2009-10-30 04:11:22

标签: javascript jquery memory-leaks selectable

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

在这个“编辑”功能中,我已经嵌套了许多“点击”事件的开关功能 我在每个“点击”事件中都有很多功能。我的问题是, 每当我触发“可选”功能时,“edit”功能内的事件再次被触发,但之前的功能和事件仍然存在。 我现在做的是取消绑定功能“编辑”中的每个事件在可选择的“开始”甚至。

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

任何人都有线索?

此处的演示页面 - > http://dreamerscorp.com/test/test01/javascript_destory_test.html

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

4 个答案:

答案 0 :(得分:8)

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

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

您也可以在功能本身内完成:

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

autoDestroy(); // returns 1
autoDestroy(); // TypeError: autoDestroy is not a function

答案 1 :(得分:6)

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

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

在这个例子中,每次点击“something”时,都会在“anotherOne”中添加一个事件处理程序,所以如果点击三次,你将获得三个事件处理程序。

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

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

没有必要明确地销毁先前的处理程序。

答案 2 :(得分:4)

基本上,您需要删除对这些函数的所有引用,以便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单击处理程序中使用data属性在附加处理程序的时间和使用它的时间之间存储数据(而不是将数据存储在将范围链保留在内存中的闭包中)。当你刚刚在那里使用内联定义函数时(例如$.each的主体),使用内联定义的函数就好了。但是当你附加事件处理程序时它不行。

答案 3 :(得分:1)

要在javascript中“销毁”某个功能,只需确保该功能无法访问即可。这将使该功能有资格进行回收。 需要注意的一点是javascript变量是基于作用域(而不是作为单个变量)绑定的,并且如果绑定保留在作用域中,则许多未使用的对象可能会持久存在: 提供更多帮助需要了解特定代码及其使用方法。

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

delete variable
delete obj.member
delete obj[member]