为什么这段javascript代码会让浏览器占用50%的CPU和这么多内存?
我有这个横幅旋转器代码:为什么这段javascript代码会让浏览器占用50%的CPU和这么多内存?,javascript,jquery,html,security,memory,Javascript,Jquery,Html,Security,Memory,我有这个横幅旋转器代码: 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] = "../
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
函数ban_rot(){
//首先预加载图像
//柜台
var i=0;
//创建对象
imageObj=新图像();
//设置图像列表
images=新数组();
图像[0]=“./Graphics/adv/1.gif”
图像[1]=“./Graphics/adv/2.jpg”
//开始预加载
对于(i=0;i使用,而不是此处,如下所示:
setTimeout(cycle, 8000);
随着您每次对越来越多的函数堆栈进行排队,而不是在8秒后调用它一次,我们将对另一个间隔计时器进行排队,以便每8秒运行一次,因此您得到以下结果:
- 8秒:1次跑步
- 16秒:2次
- 24秒:4次
- 32秒:8次
- …哦
在计时器启动时,您只需跑一次,而不是每8秒再跑一次
需要明确的是,这种情况之所以发生,是因为您每次运行它时都会调用它,在正常的一次性使用情况下,这不会是一个问题,没有什么本质上的问题。如果情况需要,函数内部的函数是可以的。在这里,计数器和链接数组是私有的,因此ban\u rot
之外的函数不会在不创建闭包的情况下,唯一的解决方法是污染名称空间,并希望没有人拥有多个横幅旋转器(或任何其他可能使用相同变量的代码)在一个页面中。尽管如此,我还是有点不习惯使用带名称的闭包。你们这些家伙都疯了。函数内部的函数绝对没有问题,“带名称的闭包”是完全安全的,因为它是作为函数声明语句来完成的,而不是作为“命名的匿名函数”是的,函数中的函数是javascript最棒的特性。哦,还有@Camran:声明数组时,你应该养成编写var a=[value,value,value];
的习惯,而不是使用新数组(…)
乍一看,这听起来有点像是setInterval()
一般存在问题,但实际上OP只是做错了。@Tomalak-你是对的,它确实是这样读的,让我澄清一点,它是特定于用法的。