JavaScript中的闭包内存泄漏模式
以下哪个JavaScript片段会泄漏内存 片段#1: 片段#2: 片段#3: 哪些变量不会被垃圾收集器收集?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
如何修复泄漏?如上所述,所有这些都不会造成内存泄漏 泄漏是通过不释放内存来控制的——内存中的所有内容都会被释放 顺便说一下,您正在展示的代码中没有一个使用闭包 现在,这里有一些可以制造“泄漏”的方法
// 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;
}
}());