请用javascript这种情况是否需要手动释放对象


前端用了Pjax,每次跳转完一个页面(没有刷新),会执行回调,回调里会调用新页面的init()初始化。


 function callback() {
    //这里用的是jQuery的Remove来删除原先页面的DOM
    容器.children().remove();
    新页面.init();
}

假设我在A页面的init()里创建一个对象:


 function A页面的init() {
    //Demo内部会为element绑定各种事件
    var demo = new Demo({ 
        element: $(...)
    });

    //demo对象会在其他操作中使用到,所以不会在init后释放
    event.on("其他操作", function() { 
        demo.abc();
    });
}

现在我跳转到B页面,$element已经随着父元素在回调里删除了,那么$element对象还在吗?demo对象还在吗?是否需要手动释放呢?

前端 web pjax JavaScript

啪啪啪·啪啪啪 9 years, 9 months ago

event这里被定义了吗,还是笔误?


 event.on("其他操作", function() { 
   demo.abc();
});

总的来说,如果利用jQuery, remove()会删除element的DOM和里面的bound events。

the .remove() method takes elements out of the DOM. Use .remove() when you want to remove the element itself, as well as everything inside it. In addition to the elements themselves, all bound events and jQuery data associated with the elements are removed. To remove the elements without removing data and events, use .detach() instead.

更详细的关于DOM被删除后会不会有memory leak的讨论: http://stackoverflow.com/questions/12528049/if-a-dom-element-is-remove...

dousky answered 9 years, 9 months ago

remove完成后,虚拟机会在适当的时候执行垃圾回收的

6yecao answered 9 years, 9 months ago

chrome debug 或者 console.log打印,如果存在,不需要了,就删

大哥的凝视 answered 9 years, 9 months ago

event.on使得demo对象被'event'使用,demo又使用了element对象。 所以element对象是否被释放, 要看event对象是否已经被释放。 如果event对象也已经释放了, 那么element会在一个合适的时机被垃圾回收。

chrome 的 devTools中的Profiles可以查看内存的变化情况, 可以学着去使用。

poing66 answered 9 years, 9 months ago

Your Answer