【问题标题】:Javascript closures - how to prevent memory leaksJavascript 闭包 - 如何防止内存泄漏
【发布时间】:2015-06-11 02:19:27
【问题描述】:

我试图了解在 JavaScript 中使用闭包时如何防止内存泄漏。有人可以告诉我我所做的是否正确吗?

我有一个虚拟函数:

var testFunction = function(obj1){

   //other code..

   on(control, "click", function(){
         obj1.label= "test";
    });

 };

1) 上面是否会因为点击事件中引用了obj1而导致内存泄漏?

2) 我可以通过以下方式修复它吗:

 var testFunction = function(obj1){

      //other code.....

       on(control, "click", function(){
             var newObj1 = obj1;
             newObj1.label= "test";
             newObj1 = null;
        });


    };

如果这是一个糟糕的例子,有人可以向我展示一个更好的内存泄漏闭包示例以及如何修复它吗?

提前致谢!

【问题讨论】:

  • 这两个功能都不起作用。 (好吧,函数会起作用,但事件处理程序会失败。)
  • 谢谢,我把设置 obj1 = null 的那行去掉了。

标签: javascript memory-leaks closures


【解决方案1】:

我试图了解在 JavaScript 中使用闭包时如何防止内存泄漏。

你几乎不需要。引擎的垃圾收集器会为您执行此操作。它非常强大,而且很少需要帮助。

以上是否会因为点击事件中引用了obj1而导致内存泄漏?

它确实阻止了obj1 被垃圾收集,是的,因为你仍然引用它。但是,这不符合“内存泄漏”的条件,因为它是故意的。您想要将对象保留在内存中。

如果testFunction 的调用频率比您预期的要高,并且如果on 确实保留闭包的时间比需要的时间长,则可能会发生泄漏。

我可以通过以下方式修复它吗

a) 没有什么可修复的 b) 不,引入额外的变量不会改变行为。 obj1 仍然从闭包中引用。

【讨论】:

  • 感谢您澄清什么是内存泄漏,因为我确实想保留该对象。
猜你喜欢
  • 2012-03-30
  • 1970-01-01
  • 2010-12-20
  • 2019-06-23
  • 1970-01-01
  • 2010-09-21
  • 2021-08-02
  • 2015-02-05
相关资源
最近更新 更多