Утечка памяти для javascript setInterval - PullRequest
3 голосов
/ 11 апреля 2011

Есть ли разница между этими двумя утверждениями

setInterval(animateImage, 1000);

or 

setInterval('animateImage()', 1000);

Будет ли второе утверждение интерпретироваться движком js браузера любым другим способом, который может вызвать утечку памяти или проблемы с производительностью. То же самое и в случае вызова setTimeout(). Приложение использует 4 таймера с интервалами 1-2 секунды.

Ответы [ 5 ]

6 голосов
/ 11 апреля 2011

Самое большое отличие состоит в том, что второй оператор приведет к тому, что animateImage() будет оцениваться в глобальной области видимости.

Это может привести к проблемам, если

  • animateImage не вглобальная область действия
  • animateImage имеет доступ к переменным, которые не входят в глобальную область действия

Например: не будет работать:

function foo() {
    var answer = 42;
    function bar() {
        alert(answer);
    }
    setTimeout('bar()', 1000);
}

foo();

На самом деле нет никакой причины использовать второе утверждение, поэтому вопрос об утечках памяти больше не актуален;)

И очевидно, что прямая ссылка на функцию будет «быстрее», чем eval Использование строки.

3 голосов
/ 11 апреля 2011

Используйте первый. Это делает отладку более приятной, поскольку не требуется никакого eval'd-кода, она быстрее и чище Эвал - это зло, и хорошо, когда это возможно, избегать его.

Если вам когда-либо понадобится передать аргумент, используйте следующий код:

setInterval(function() {
    animateImage(...);
}, 1000);
2 голосов
/ 11 апреля 2011

Второе утверждение будет , вероятно, немного медленнее и будет занимать больше памяти, но в любом случае оно не будет значительным.Вы должны использовать первый независимо, потому что, как правило, лучше избегать использования eval.

0 голосов
/ 26 сентября 2011

Я рекомендую использовать его так:

setInterval(function(param1, param2){animateImage(param1, param2)}, 1000);

для передачи параметров вместо передачи их в конце

0 голосов
/ 11 апреля 2011

Я так не думаю.Вы хотите использовать обратные вызовы, чтобы избежать утечек памяти.

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