【问题标题】:Memory leak for javascript setIntervaljavascript setInterval 的内存泄漏
【发布时间】:2011-04-11 12:26:51
【问题描述】:
这两种说法有什么区别
setInterval(animateImage, 1000);
or
setInterval('animateImage()', 1000);
浏览器 js 引擎是否会以任何不同的方式解释第二个语句,这可能会导致内存泄漏或性能问题。 setTimeout() 调用也是如此。该应用程序使用 4 个计时器调用,间隔为 1-2 秒。
【问题讨论】:
标签:
javascript
performance
timeout
【解决方案1】:
最大的不同是第二条语句会导致animateImage()在全局范围内被求值。
这可能会导致问题,如果
-
animateImage 不在全局范围内
-
animateImage 必须访问不在全局范围内的变量
例如以下将不工作:
function foo() {
var answer = 42;
function bar() {
alert(answer);
}
setTimeout('bar()', 1000);
}
foo();
实际上没有理由使用第二条语句,所以关于内存泄漏的问题不再相关;)
显然,传递对函数的直接引用将比evaluating 字符串“更快”。
【解决方案2】:
使用第一个。它使调试更好,因为不涉及 eval'd 代码,它更快更干净。 eval 是邪恶的,尽可能避免它是好的。
如果您需要传递参数,请使用以下代码:
setInterval(function() {
animateImage(...);
}, 1000);
【解决方案3】:
第二条语句可能会稍微慢一些并使用更多内存,但无论哪种方式都不重要。无论如何你都应该使用第一个,因为通常最好避免使用eval。
【解决方案5】:
我建议像这样使用它:
setInterval(function(param1, param2){animateImage(param1, param2)}, 1000);
传递参数而不是最后传递它们