JavaScript中的闭包内存泄漏模式

JavaScript中的闭包内存泄漏模式,javascript,memory-leaks,closures,Javascript,Memory Leaks,Closures,以下哪个JavaScript片段会泄漏内存 片段#1: 片段#2: 片段#3: 哪些变量不会被垃圾收集器收集? 如何修复泄漏?如上所述,所有这些都不会造成内存泄漏 泄漏是通过不释放内存来控制的——内存中的所有内容都会被释放 顺便说一下,您正在展示的代码中没有一个使用闭包 现在,这里有一些可以制造“泄漏”的方法 // Simple leak -- an array that never lets go of memory var arrayThatNeverShrinks = []; functi

以下哪个JavaScript片段会泄漏内存

片段#1:

片段#2:

片段#3:

哪些变量不会被垃圾收集器收集?
如何修复泄漏?

如上所述,所有这些都不会造成内存泄漏

泄漏是通过不释放内存来控制的——内存中的所有内容都会被释放

顺便说一下,您正在展示的代码中没有一个使用闭包

现在,这里有一些可以制造“泄漏”的方法

// Simple leak -- an array that never lets go of memory
var arrayThatNeverShrinks = [];
function doleak() {
  var s = "1234567890";
  arrayThatNeverShrinks.push(s);
  window.setTimeout(doleak, 500);
}
//start if off
doleak();


// This function leaks because bigVar is used -- and kept -- 
// inside of the anonymous function inside.
    //Another leak, using closures
    var leakingFunction = (function() {
      var bigVar = "1234567890";
      return function() {
        alert("Hi there");
        var keepBigVar = bigVar;
      }
    }());

如上所述,所有这些都不会造成内存泄漏

泄漏是通过不释放内存来控制的——内存中的所有内容都会被释放

顺便说一下,您正在展示的代码中没有一个使用闭包

现在,这里有一些可以制造“泄漏”的方法

// Simple leak -- an array that never lets go of memory
var arrayThatNeverShrinks = [];
function doleak() {
  var s = "1234567890";
  arrayThatNeverShrinks.push(s);
  window.setTimeout(doleak, 500);
}
//start if off
doleak();


// This function leaks because bigVar is used -- and kept -- 
// inside of the anonymous function inside.
    //Another leak, using closures
    var leakingFunction = (function() {
      var bigVar = "1234567890";
      return function() {
        alert("Hi there");
        var keepBigVar = bigVar;
      }
    }());

老问题,但我有几个问题与最高评级的答案-

顺便说一下,您显示的代码中没有一个使用闭包

代码片段一中的点击处理程序在很大程度上是一个闭包——它关闭传递给foo的obj参数。因此,分配给obj的内存将不会被释放,直到用另一个对象再次调用foo

并不是说这里有漏洞,只是想指出片段一确实创建了一个闭包

而且

泄漏是通过不释放内存来控制的——内存中的所有内容都会被释放


这适用于代码段2和3,但不适用于代码段1

老问题,但我有几个问题与最高评级的答案-

顺便说一下,您显示的代码中没有一个使用闭包

代码片段一中的点击处理程序在很大程度上是一个闭包——它关闭传递给foo的obj参数。因此,分配给obj的内存将不会被释放,直到用另一个对象再次调用foo

并不是说这里有漏洞,只是想指出片段一确实创建了一个闭包

而且

泄漏是通过不释放内存来控制的——内存中的所有内容都会被释放


这适用于代码段2和3,但不适用于代码段1

根据这句话,“闭包是指独立(自由)变量的函数。”我的代码片段不是闭包,因为它们使用匿名函数作为参数变量,对吗?闭包必须从外部范围“关闭”该范围并保留它。与上面的示例一样,
keepBigVar
形成一个闭包,因为它挂起外部作用域中的
bigVar
。“leakingFunction”执行并完成——它消失了——但
BigVar
仍然存在<代码>函数foo(obj){$('#something')。单击(function(){var keepObj=obj;})}这会导致泄漏吗?
obj
被捕获在一个闭包中,但是除非您多次调用
foo
,否则它就不是泄漏。感谢@JeremyJStarcher提供了这个很棒的示例。根据这个例子,上面说“闭包是引用独立(自由)变量的函数。”我的代码段不是闭包,因为它们使用匿名函数作为参数变量,对吗?闭包必须从外部作用域“close over”捕获某些内容“这是一个范围,并坚持下去。与上面的示例一样,
keepBigVar
形成一个闭包,因为它挂起外部作用域中的
bigVar
。“leakingFunction”执行并完成——它消失了——但
BigVar
仍然存在<代码>函数foo(obj){$('#something')。单击(function(){var keepObj=obj;})}这会导致泄漏吗?
obj
被捕获在一个闭包中,但是除非您多次调用
foo
,否则它不是泄漏。感谢@JeremyJStarcher提供了这个非常棒的示例。
function foo(obj)
{
    var obj2= {id: 1}
    bar(function() { alert(obj2.id); } );
}

function bar(func)
{
    var obj3 = {};
    func();
}
// Simple leak -- an array that never lets go of memory
var arrayThatNeverShrinks = [];
function doleak() {
  var s = "1234567890";
  arrayThatNeverShrinks.push(s);
  window.setTimeout(doleak, 500);
}
//start if off
doleak();


// This function leaks because bigVar is used -- and kept -- 
// inside of the anonymous function inside.
    //Another leak, using closures
    var leakingFunction = (function() {
      var bigVar = "1234567890";
      return function() {
        alert("Hi there");
        var keepBigVar = bigVar;
      }
    }());