Создает ли этот setTimeout утечки памяти? - PullRequest
2 голосов
/ 27 мая 2011

Создает ли этот код утечки памяти? Или что-то не так с кодом?

HTML:

<div id='info'></div>

Javascript:

var count = 0;

function KeepAlive()
{
    count++;

    $('#info').html(count);
    var t=setTimeout(KeepAlive,1000);
}
KeepAlive();

Запустите тест здесь: http://jsfiddle.net/RjGav/

Ответы [ 4 ]

5 голосов
/ 27 мая 2011

Я думаю, что это утечка, потому что последовательные ссылки никогда не выпускаются. То есть первый вызов немедленно создает замыкание, ссылаясь на функцию внутри себя. Когда он снова вызывает себя, новая ссылка берется из экземпляра, созданного на первой итерации, поэтому первая никогда больше не может быть освобождена.

Вы можете довольно легко проверить эту теорию, изменив интервал на что-то очень маленькое, и посмотреть память в chrome ...

(правка) Теория, проверенная вашей скрипкой, на самом деле, я ошибаюсь, она не просочилась, по крайней мере, в Chrome. Но это не гарантия, что какой-то другой браузер (например, более старый IE) не так хорош в сборке мусора.

Но независимо от того, протекает он или нет, нет причин не использовать setInterval.

5 голосов
/ 27 мая 2011

Вы, вероятно, должны использовать setInterval вместо:

var count = 0;

function KeepAlive() {
  $('#info').html(++count);
}

var KAinterval = setInterval(KeepAlive, 1000);

Вы можете отменить его, если вам когда-либо понадобится, позвонив по номеру clearInterval(KAinterval);.

3 голосов
/ 27 мая 2011

Это не должно создавать утечку, потому что функция KeepAlive будет завершена своевременно и, таким образом, освободит все переменные в этой функции.Кроме того, в вашем текущем коде нет причин устанавливать переменную t, поскольку она не используется.Если вы хотите использовать его для отмены вашего мероприятия, вы должны объявить его в более широком контексте.

Кроме этого, я не вижу ничего «неправильного» в вашем коде, но это действительно зависит от того, что вы пытаетесь сделать.Например, если вы пытаетесь использовать это как точный таймер, он будет медленнее, чем обычные часы.Таким образом, вам следует либо установить дату загрузки страницы и рассчитать разницу, когда она вам понадобится, либо использовать setInterval, как рекомендует gddc.

2 голосов
/ 27 мая 2011

Хорошо иметь метод setInterval, такой как упомянутый gddc.
Более того, лучше хранить $('#info') в переменной вне функции.

Оформить заказ http://jsfiddle.net/RjGav/1/

...