2011-04-11 77 views
3

內存泄漏會出現第二條語句由瀏覽器JS引擎來解釋這2所陳述對JavaScript的setInterval

setInterval(animateImage, 1000); 

or 

setInterval('animateImage()', 1000); 

之間的差額任何不同的方式,可能會導致內存泄漏或性能問題。呼叫setTimeout()的情況也是如此。該應用程序使用4個定時器間隔1-2秒的呼叫。

回答

6

最大的區別在於第二個語句將導致animateImage()在全局範圍內進行評估。

這可能導致問題,如果

  • animateImage是不是在全球範圍內
  • animateImage有權訪問不在全球範圍內

例如變量下面將工作:

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

foo(); 

其實從來就沒有理由使用第二個語句,因此關於內存泄漏問題是不再相關;)

很顯然,通過直接引用到一個函數將會比'eval'更快。

2

第二個聲明將可能會稍微慢一點,並使用更多的內存,但它不會顯着的任何方式。無論如何,你應該使用第一個,因爲通常最好避免使用eval

3

使用第一個。它使調試更好,因爲沒有涉及代碼,它更快,更乾淨。 Eval是邪惡的,只要有可能就避免它。

如果你需要傳遞一個參數,使用下面的代碼:

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

我不這麼認爲。你想使用回調來避免內存泄漏。

0

我建議使用它像這樣:

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

,而不是通過將它們在年底

的參數