Утечка памяти для 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);
передавать параметры вместо передачи их в конце