Почему этот код javascript заставляет браузер потреблять 50% ресурсов процессора и столько памяти? - PullRequest
2 голосов
/ 31 октября 2010

У меня есть этот код ротатора баннера:

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

При использовании этого кода примерно через 2-3 минуты в Firefox или Chrome память увеличивается, а процессор увеличивается примерно до 50%. Компьютер зависает, и я должен завершить Chrome и FF.

Есть ли какая-либо причина для этого в приведенном выше коде?

Спасибо

1 Ответ

17 голосов
/ 31 октября 2010

Используйте setTimeout() вместо setInterval() здесь, вот так:

setTimeout(cycle, 8000);

С setInterval() you 'Выстраивая в очередь все больше и больше стеков функции каждый раз, вместо того, чтобы вызывать ее один раз через 8 секунд, мы ставим в очередь еще один интервальный таймер для запуска каждые 8 ​​секунд, поэтому вы получаете следующее:

  • 8 секунд: 1 прогон
  • 16 секунд: 2 прогона
  • 24 секунды: 4 прогона
  • 32 секунды: 8 прогонов
  • ... э-э-э

При setTimeout() вы получите только один прогон при включенном таймере, а не дополнительный прогон каждые 8 ​​секунд.

Чтобы быть ясным, это происходит , потому что вы звоните ему каждый раз, когда он запускается, при обычном однократном использовании это не было бы проблемой, нет ничего изначально злого с setInterval().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...