闭包导致内存泄漏的一个经典案例是:
```javascript
function
createLeak()
{
var
privateVariable
=
'I
am
a
private
variable';
function
privateFunction()
{
console.log(privateVariable);
}
return
{
publicFunction:
privateFunction
};
}
var
closureLeak
=
createLeak();
```
在这个案例中,`createLeak`函数内部定义了一个私有变量`privateVariable`和一个私有函数`privateFunction`,然后返回了一个包含`privateFunction`引用的对象。当我们创建`closureLeak`变量并赋值为`createLeak()`的返回值时,`privateFunction`被赋值给`publicFunction`属性,因此我们可以通过`closureLeak.publicFunction`来访问`privateFunction`。
然而,因为`privateFunction`引用了`privateVariable`,使得`privateVariable`无法被垃圾回收。即使我们不再需要`createLeak`函数和`closureLeak`对象,`privateVariable`所占用的内存也无法被回收,从而导致内存泄漏。
要避免这种内存泄漏,我们可以确保不返回任何引用闭包的函数,或者在不再需要时手动断开引用。例如:
```javascript
function
createLeak()
{
var
privateVariable
=
'I
am
a
private
variable';
function
privateFunction()
{
console.log(privateVariable);
}
var
result
=
{
publicFunction:
privateFunction
};
//
手动断开引用
privateVariable
=
null;
privateFunction
=
null;
return
result;
}
var
closureLeak
=
createLeak();
```
在这个修改后的版本中,我们在返回结果之前手动将`privateVariable`和`privateFunction`设置为`null`,从而断开了它们与闭包的联系,使得闭包可以在不再需要时被垃圾回收。