Javascript &引用;“类”;继续工作而不被全局引用

Javascript &引用;“类”;继续工作而不被全局引用,javascript,garbage-collection,Javascript,Garbage Collection,我制作了一个图像滑块“类”,最初将其实例化为: var foo=newslider(document.getElementById(“featuredSlider”),900) 我试图删除var foo=,但它仍然有效,这让我感到惊讶。是什么让它继续工作?不在全球范围内引用它是个坏主意吗 在旁注中,“featuredSlider”是标签的id。它包含一些标记,每个都包含标记 function Slider(inElement, inStep) { if (!inElement) retu

我制作了一个图像滑块“类”,最初将其实例化为:

var foo=newslider(document.getElementById(“featuredSlider”),900)

我试图删除
var foo=
,但它仍然有效,这让我感到惊讶。是什么让它继续工作?不在全球范围内引用它是个坏主意吗

在旁注中,
“featuredSlider”
标签的
id
。它包含一些
标记,每个都包含
标记

function Slider(inElement, inStep) {
    if (!inElement) return;

    this.element = inElement;
    this.start = 0;
    this.end = 0;

    var self = this;
    var limit = inElement.getElementsByTagName("a").length*inStep;
    setInterval(function() {
        self.start = self.end;
        self.end = (self.end+inStep)%limit;
        self.animate(this.start < this.end ? 1 : -1);
    }, 3000);
}

Slider.prototype.animate = function(inZeno) {
    this.start += ((this.end-this.start)>>2)+inZeno;
    this.element.style.left = this.start+"px";

    if (this.start !== this.end) {
        var self = this;
        setTimeout(function() {
            self.animate(self.start < self.end ? 1 : -1);
        }, 33);
    }
}

//new Slider(document.getElementById("featuredSlider"), 900);
var foo = new Slider(document.getElementById("featuredSlider"), 900);
功能滑块(内固定,脚背){
如果(!取消)返回;
该元素=非水泥;
这个.start=0;
这个0.end=0;
var self=这个;
var limit=inElement.getElementsByTagName(“a”).长度*脚背;
setInterval(函数(){
self.start=self.end;
self.end=(self.end+脚背)%极限;
自行设置动画(this.start>2)+inZeno;
this.element.style.left=this.start+“px”;
if(this.start!==this.end){
var self=这个;
setTimeout(函数(){
设置自动画(自开始<自结束?1:-1);
}, 33);
}
}
//新滑块(document.getElementById(“featuredSlider”),900);
var foo=新滑块(document.getElementById(“featuredSlider”),900);
我尝试删除var foo=并继续工作,这让我感到惊讶。是什么让它继续工作

因为对它的引用由计时器系统保存,因为它设置了通过
setInterval
setTimeout
引用它的函数(闭包)的回调。因此,只要计时器还在,对它的必要部分的引用就会一直保留

它提供给
setInterval
的函数如下:

setInterval(function() {
    self.start = self.end;
    self.end = (self.end+inStep)%limit;
    self.animate(this.start < this.end ? 1 : -1);
}, 3000);
setInterval(函数(){
self.start=self.end;
self.end=(self.end+脚背)%极限;
自行设置动画(this.start
是对
滑块
调用的结束。因此,只要闭包(函数)存在,闭包范围内的所有内容都会保留。由于该计时器从未取消,因此计时器系统使这些引用保持活动状态。(如果“结束”不熟悉或只是稍微熟悉,不要担心:)

不在全球范围内引用它是个坏主意吗


不,没关系。如果它继续工作,而您不需要引用,则无需存储对它的引用。当很多人使用script.aculo.us时,这是一种非常常见的模式,它使用
new
获得了大约一半的效果。

你能解释一下“将自己附加到
div
”吗?我从来没有听说过这样一个故事thing@asimes:在div上设置事件处理程序,在div上设置数据属性等。例如:
var self=this;div.addEventListener(“单击”,函数(){self.doSomething();},false)
现在
div
有一个对
self
的引用,这就是
this
,只要
div
有该引用,对象就会一直存在。@PatrickEvans:是的,谢谢。我必须承认,我假设代码块是使用滑块的OP,而不是滑块的代码。已修复。@asimes:抱歉,它没有连接到
div
,因为Patrick说是计时器系统使它保持活动状态。(事实上,情况正好相反:即使您从DOM中删除
div
,除非您取消计时器,否则滑块会将
div
保留在内存中,并与DOM断开连接。)直到我走近一点,我都有同样的印象:)