为什么我的数字时钟功能会泄漏内存?

时间:2015-05-20 12:40:00

标签: javascript jquery performance memory-leaks

我有一个数字时钟函数,它从JSON结果中获取小时,分钟和秒,将它们解析为整数,对它们进行数学计算(每次循环时加1到秒,如果秒为0,加1到分钟等。在那个数学运算之后,我将这三个变量解析为字符串,然后我可以使用前导0来填充它们,以获得看起来像

的结果

10时05分34秒 (小时,分钟,秒)。

我使用此方法而不是日期时间,因为JS将始终在本地时间解析日期时间,但这三个变量基于服务器时间。

function countTime(){
        timeSeconds = parseInt(timeSeconds);
        timeMinutes = parseInt(timeMinutes);
        timeHours = parseInt(timeHours);

        timeSeconds = (timeSeconds + 1);
        if (timeSeconds == 60){timeMinutes = (timeMinutes + 1); timeSeconds = 0;};
        if (timeMinutes == 60){timeHours = (timeHours + 1); timeMinutes = 0;};

        //convert from 24 to 12 hour time, and "0" hour to 12
        if (timeHours > 12){
            timeHours = (timeHours - 12)
        };
        if (timeHours == 0){
            timeHours = 12;
        };

        //back to strings so that 0s can be padded
        timeSeconds = timeSeconds.toString();
        timeMinutes = timeMinutes.toString();
        timeHours = timeHours.toString();

        //pad 0s
        if (timeSeconds <= 10 && timeSeconds.length < 2)(timeSeconds = ("0" + timeSeconds));
        if (timeMinutes <= 10 && timeMinutes.length < 2)(timeMinutes = ("0" + timeMinutes));
        if (timeHours <= 10 && timeHours.length < 2)(timeHours = ("0" + timeHours));

        //show time
        timetext = timeHours + ":" + timeMinutes + ":" + timeSeconds
        $('#BT').html(timetext);
    };

此函数调用它以一定间隔设置它:

function updateTime() {
    countTime();
    timeInt = setInterval(countTime,1000);
    console.log('updated time from server');
};

timeInt之前已全局初始化,因此我可以在窗口焦点事件上清除该间隔。 当我从我的页面中取出这个功能时,我的内存使用量大约为20kb,相当确定。包含此功能,内存使用开始大约40kb并且每秒增加(我认为这意味着内存泄漏......)。 updateTime是在非标准时间间隔内调用的(大约每45分钟由AJAX调用的成功回调调用timeHourstimeMinutestimeSeconds。我是否有范围问题?当我在一段时间内countTime时,我是否会不必要地重新定义变量?

1 个答案:

答案 0 :(得分:1)

您正在泄漏间隔计时器。您需要在再次初始化之前致电clearInterval

function updateTime() {
    countTime();
    clearInterval(timeInt); // Here
    timeInt = setInterval(countTime,1000);
    console.log('updated time from server');
};