1

对不起我的英语,我是法语 :) 我创建了一个名为“Slider”的 Mootools 类。这个类有一个“slider_element”属性,它是一个 DIV 元素。该类还有一个“破坏者”方法。此方法会破坏 DIV 元素。

slider_element 应该是一个 div,其中包含另一个具有“删除”CSS 类名的 DIV。当我点击“remove DIV”时,我希望调用“destroyer”方法,这样DIV就消失了。

下面是我的代码,它可以像我想要的那样以图形方式工作。我的问题是:当我销毁 DIV 元素时,我不再需要我的 Slider 实例(此处为“mySlider”)。但是我的代码破坏了 DIV 元素,而不是滑块实例。这个实例还存在吗?我想是的。因此,我搜索了如何使用 Mootools 销毁类的实例,但没有找到……所以我想我做错了事,即使我的代码以图形方式执行了我想要的操作。请帮忙 :)

var Slider = new Class({
    initialize: function(slider_element){
        this.slider_element = slider_element;
        this.slider_element.getElements('*[class="remove"]').addEvent('click', this.destroyer.bind(this));
    },
    destroyer: function(){
    this.slider_element.destroy();
    }   
});
var myElement = $('my_slider');
var mySlider = new Slider(myElement);

(实际上,这是一个简化的代码,所以我不会用我的整个代码打扰你)

4

1 回答 1

0

没有办法在 JavaScript 中显式地销毁对象。您能做的最好的事情就是删除对它的所有引用,并希望您的 JavaScript 实现重用内存。

所以原则上你可以mySlidernull. 但是很容易有你无法控制的“隐式”引用,例如在闭包中(用于事件)——你可以通过“清除”任何引用其他对象的属性来帮助垃圾收集器,之前扔掉它,但是如果引用在某个地方存在并且某些东西试图使用这些属性,则必须确保不会发生任何不好的事情。

对于元素,Mootools 具有destroy遍历整个 DOM 子树的方法,并在将元素从 DOM 中删除之前清除所有属性以及元素的相关存储,例如事件侦听器。

在您的情况下,正如@Dimitar Christoff 所写,如果您没有任何外部代码调用Slider对象上的方法,则无需将对它的引用保存在var mySlider.

如果你不这样做,唯一能让Slider对象保持活动状态的就是来自调用中构建的闭包的堆栈帧的.bind(this)引用addEvent。当事件触发并被destroy调用时,事件监听器被移除,JavaScript 引擎也可以自由地释放Slider对象。

于 2011-03-28T09:33:44.050 回答