Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这段javascript代码会让浏览器占用50%的CPU和这么多内存?_Javascript_Jquery_Html_Security_Memory - Fatal编程技术网

为什么这段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-你是对的,它确实是这样读的,让我澄清一点,它是特定于用法的。