2012-01-11 54 views
1

我正在调试一个代码,我认为它有一些内存泄漏。在Google Chrome中运行代码时,浏览器会在一段时间后崩溃。我坚信下面的代码(只附加一个模板,而不是简单的整个代码)就是这个问题。当我使用Chrome开发人员工具“时间轴”选项卡并观看实际应用程序中的内存使用情况和内存高峰时。如果您注意到播放正在调用的代码transitionTo和transistionTo有一个setTimeout函数再次调用播放。我认为记忆不会因为这个而被释放。有谁能帮我解决这个问题吗?JavaScript setTimeout内存问题

var htmlRotatorTimer = ''; 

    function play(src){ 
     // some code here 
     transitionTo("gallery", "counter"); 
     // some code here 
    } 

    function transitionTo(gallery,index) {  
     // some code here  
     clearTimeout(htmlRotatorTimer); 
     htmlRotatorTimer = setTimeout(function(){ play(); }, 1000);  
     // some code here 
    } 

play(); 

下面的代码

// utility for loading slides 
     function transitionTo(gallery,index) { 

      // preloader (optional) 
      var counterMin = 0; 
      if (config.preloader) { 
       counterMin = 1; 
       if (gallery.length < 3) pause('');     
      } 

      var oldCounter = counter; 
      if((counter >= gallery.length) || (index >= gallery.length)) { counter = counterMin; var e2b = true; } 
      else if((counter < counterMin) || (index < 0)) { counter = gallery.length-1; var b2e = true; } 
      else { counter = index; } 



    // added attr speed in div's 
//htmlRotatorTimer = ''; 
     var itemSpeed = Number($(gallery[counter]).attr("speed") != undefined ? $(gallery[counter]).attr("speed") : config.speed); 
      //htmlRotatorTimer = setInterval(function(){ play(); },itemSpeed); 
      clearTimeout(htmlRotatorTimer); 
      htmlRotatorTimer = setTimeout(function(){ play(); }, itemSpeed); 

      var rmkName = $(gallery[counter].children).attr("id") != undefined ? 'RMK_' + $(gallery[counter].children).attr("id") : ''; 
      var isHtml5 = false; 
      if (rmkName != '' && eval ('typeof '+ rmkName) == 'object') {     
       rmkObj = eval(rmkName);  
       isHtml5 = rmkObj.rmkType == 'html5' ? true : false; 
       //console.log('html5 is' + rmkObj.rmkType,'obj name' + rmkName, 'typeof:' +(typeof rmkObj));    
      } 

    if (config.effect=='fade') {  
     $(gallery[counter]) 
     .clone() 
     .appendTo($cont) 
     .hide()      
     .fadeIn(config.changeSpeed,function(){$('#showbanners.rmkbanner').css({ 'visibility': 'visible'});if($.browser.msie)this.style.removeAttribute('filter');});       
       if($cont.children().length>1){ 
        $cont.children().eq(0).css('position','absolute').fadeOut(config.changeSpeed,function(){$(this).remove();}); 
       }; 
      } else if (config.effect=='none') { 
       $(gallery[counter]) 
        .appendTo($cont); 
       if($cont.children().length>1){ 
        $cont.children().eq(0).remove(); 
       }; 
      }; 
      // update active class on slide link 
      if(config.links){ 
       $('.'+uniqueClass+'-active').removeClass(uniqueClass+'-active jshowoff-active'); 
       $('.'+uniqueClass+'-slidelinks a').eq(counter).addClass(uniqueClass+'-active jshowoff-active'); 
      }; 

      // reset for html5 objects only 
      if (isHtml5) { 
        rmkObj.preload = 'nopreload'; 
        rmkObj.Reset(); 
      } 
     };// end function transistionTo 

     // is the rotator currently in 'play' mode 
     function isPlaying(){ 
      return $('.'+uniqueClass+'-play').hasClass('jshowoff-paused') ? false : true; 
     }; 

     // start slide rotation on specified interval 
     function play(src) { 
      if (!finalStop) { 
       if (!isBusy()) { 
        counter++; 
        transitionTo(gallery, counter); 
        if (src == 'hover' || !isPlaying()) { 
         //htmlRotatorTimer = setInterval(function(){ play(); },config.speed); 
         clearTimeout(htmlRotatorTimer); 
         htmlRotatorTimer = setTimeout(function(){ 
          play(); 
         }, config.speed); 
        } 
        if (!isPlaying()) { 
         $('.' + uniqueClass + '-play').text(config.controlText.pause).removeClass('jshowoff-paused ' + uniqueClass + '-paused'); 
        } 
       }; 
      }; 
     }; 
+0

那里的其他代码是什么,你列为“这里的一些代码”的东西? – Niklas 2012-01-11 11:22:23

+0

此代码不会导致高内存使用率(更不用说内存泄漏)。 – davin 2012-01-11 11:24:16

+0

什么是config.changeSpeed设置?如果它不是你的config.speed,那肯定会成为一个问题。另外,你还有很多未缓存的DOM属性检索/更新,你每秒都在做什么,你是否考虑过缓存一些元素名称,这样就不必每隔一秒都要搜索一次? – Niklas 2012-01-11 11:50:17

回答

0

我相信,你的电话打是不对的transitionTo函数中的更长的版本。你没有提供论据。顺便说一下,你为什么还要在外面打play()?如果可能,请发布整个代码。我不知道为什么你要将计数器字符串传递给transitionTo。一个建议是使用像这样的播放方法的setInterval方法

function play(){ 
    //existing logic 
    setInterval(function(){transitionTo("gallery","counter");},1000); 
} 
+0

使用'setInterval'而不是'setTimeout'在大多数情况下总是一个坏主意。 – Niklas 2012-01-11 11:26:30