【问题标题】: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

        【讨论】:

          【解决方案4】:

          我不这么认为。您想使用回调来避免内存泄漏。

          【讨论】:

            【解决方案5】:

            我建议像这样使用它:

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

            传递参数而不是最后传递它们

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-02-08
              • 1970-01-01
              • 2020-07-15
              • 2019-03-09
              • 1970-01-01
              • 2012-12-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多