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断开连接。)直到我走近一点,我都有同样的印象:)