Утечка памяти для javascript setInterval

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

setInterval(animateImage, 1000);

or 

setInterval('animateImage()', 1000);

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

5 ответов

Решение

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

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

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

Например, следующее не будет работать:

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

foo();

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

И очевидно, что прямая ссылка на функцию будет "быстрее", чем evalпрохождение строки.

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

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

setInterval(function() {
    animateImage(...);
}, 1000);

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

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

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

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

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

Другие вопросы по тегам