【发布时间】:2010-10-31 12:53:16
【问题描述】:
我有这个横幅旋转代码:
function ban_rot() {
//First preload images
// counter
var i = 0;
// create object
imageObj = new Image();
// set image list
images = new Array();
images[0] = "../Graphics/adv/1.gif"
images[1] = "../Graphics/adv/2.jpg"
// start preloading
for (i = 0; i <= images.length; i++) {
imageObj.src = images[i];
}
///////////////////////
var links = new Array("http://www.link1.com", "http://www.link2.se");
var alts = new Array("alt1", "alt2");
var titles = new Array("title1", "title2");
var counter = 0;
var banner_div = document.getElementById("ban_rot");
cycle();
function cycle() {
if (counter == links.length) {
counter = 0;
}
else if (counter < links.length) {
banner_div.innerHTML = '<a href=\"' + links[counter] + '\"><img src=\"' + images[counter] + '\" border=\"1px\" style=\"border-color:#000;\" alt=\"' + alts[counter] + '\" title=\"' + titles[counter] + '\"></a>';
//increase counter
counter++;
}
setInterval(cycle, 8000);
} //end cycle function
} //end ban_rot function
使用此代码,在 Firefox 或 Chrome 中大约 2-3 分钟后,内存上升,cpu 达到 50% 左右。 计算机变得迟钝,我必须终止 Chrome 和 FF。
上面这段代码有什么原因吗?
谢谢
【问题讨论】:
-
如果情况需要,函数内部的函数就可以了。在这里,计数器和链接数组是私有的,因此
ban_rot之外的函数将无法访问它们。在不创建闭包的情况下解决此问题的唯一方法是污染名称空间并希望没有人在页面中拥有多个横幅旋转器(或任何其他可能使用相同变量的代码)。话虽如此,但我对带有名称的闭包有点不舒服。 -
你们疯了。函数内部的函数绝对没有问题,并且“带名称的闭包”是完全安全的,因为它是作为函数声明语句完成的,而不是作为“命名匿名函数”(由于实现不佳而存在问题)。
-
是的,functions in functions是javascript最棒的特性。
-
哦还有@Camran:在声明数组时,你应该养成写
var a = [value, value, value];而不是使用new Array(...);的习惯
标签: javascript jquery html security memory