setTimeout节省内存写法

212 阅读1分钟
   var oBox = document.getElementById('box');
    var maxLeft = utils.win('clientWidth') - oBox.offsetWidth;
    var step = 5;
    var timer = null;

    // 使用递归思想完成setTimout的轮询动画:
    // 每一次在执行动画之前,首先把上一次设置的那一个没有用的定时器清除,以节约内存
    function move() {
        window.clearTimeout(timer);
        var curLeft = utils.css(oBox, 'left');

        if (curLeft + step >= maxLeft) { // 边界判断: 加上步长计算
            utils.css(oBox, 'left', maxLeft);
            return;
        }

        curLeft += step;
        utils.css(oBox, 'left', curLeft);

        timer = window.setTimeout(move, 10);
    }

    move();

var timeblc = document.getElementById('nowtime');

    var weekdays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];

    function addZero(t){

        if(t<10) return '0'+t;

        return t;

    }

    function showTime(){

        var time = new Date();

        var t = time.getFullYear()+'年'+getMonthDay(time)+getWeekday(time)+getHMS(time);

        timeblc.innerHTML = t;

        setTimeout('showTime()',1000);      //这里!!

    }

    function getMonthDay(time){

        var m = addZero(time.getMonth()+1);

        var d = addZero(time.getDate());

        var str = m+'月'+d+'日';

        return str;

    }

    function getWeekday(time){

        var str = weekdays[time.getDay()];

        return str;

    }

    function getHMS(time){

        var h = addZero(time.getHours());

        var m = addZero(time.getMinutes());

        var s = addZero(time.getSeconds());

        var str = h+':'+m+':'+s;

        return str;

    }

    showTime();`

代码注释处,第一个参数若不添加引号则引发内存溢出

备注:

我有一个javascript代码来控制动画div。在这我使用setTimeout使div移动。您可以点击以下链接播放动画。在javascript中的setTimeout内存泄漏问题

 `http://jsfiddle.net/dudling007/PfPzj/3/` 

的问题是,播放动画,每当我点击了暂停一对夫妇的时间和恢复按钮后,它需要大量的内存和暂停按钮的点击也变得如此之慢。我看到了MAC OSX的活动监视器的%CPU和实际内存消耗。有人请帮助我,单击暂停按钮10 -14次后,代码中会消耗大量内存的问题是什么。

来源

2013-05-28 Dudling

+1

的方法animate当一个通知,说有代码陪你的jsfiddle链接,这是有原因的。 – George

+0

您可能想要使用jQuery()。animate()。 – Inkbug

A

回答

1****

内存泄漏是因为事件是在每次moveCard方法被调用的时间。按钮绑定应该移出 “对象”循环。

您可以使用的工具链接firebugfirefox检查的JavaScript控制台日志。 以下是您登录暂停按钮的示例。这应该只发生一次。 jsfiddle.net/Th6ha/1/

$('#pause_button').click(function() { 
console.log('pause pressed'); 
         arrayObject.pause(wStart,lStart,wEnd,lEnd); 
         $('#resume_button').css('display','inline-block'); 
         $('#pause_button').css('display','none'); 

         }); 

你可以考虑使用jQuery