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

ben*_*ben 5 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 :)非常感谢您的帮助,您的评论对我非常有用,再次感谢!!!

CMS*_*CMS 8

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

myFunction = null;
// or 
myFunction = function () {};
Run Code Online (Sandbox Code Playgroud)

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

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

autoDestroy(); // returns 1
autoDestroy(); // TypeError: autoDestroy is not a function
Run Code Online (Sandbox Code Playgroud)


use*_*291 6

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

$("something").click(function() {
    $("anotherOne").click(function() {
         ....
    });
});
Run Code Online (Sandbox Code Playgroud)

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

$("something").click(function() {
    $("anotherOne").unbind('click').click(function() {
         ....
    });
});
Run Code Online (Sandbox Code Playgroud)

在这里,你可以保证在"anotherOne"上只有一个点击处理程序.

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


Ant*_*lls 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();
        });
      });
Run Code Online (Sandbox Code Playgroud)

换句话说,在一个函数中,你是在说,“把这个函数附加到一个 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);
      });
Run Code Online (Sandbox Code Playgroud)

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