A closure:
function test() {
var count = 0;
return function() {
count++;
};
}
As we all know, the count
won\'t rele
All objects in javascript is garbage collected, regardless of weather they're involved in a closure or not. In your code above, if you do:
var x = test();
then of course the memory for count
cannot be released because it may be used later by x
. However if you do:
var x = test();
x = "";
the memory for count
will be garbage collected sooner or later.
Also, if you do:
function foo () {
var x = test();
x();
}
foo();
the memory for count
would also be garbage collected because x
goes out of scope when foo()
ends.
The best way to ensure you don't have memory leaks in javascript is to avoid global variables.
Note: The garbage collector in old versions of IE used a simple reference count which means that circular data structures are not garbage collected. This was fixed in either IE6 or IE7 and was never a problem in other javascript engines which normally use a mark-and-sweep garbage collector
closures is a massive source of memory leaks in JavaScript.
function foo() {
var count = 0;
function do() {
return count++;
}
return {
do: do}
}
Here foo() return the do function expression and do() have closure over th e count variable. We don't know when the returned do() expression will be called. So the garbage collector can't understand when to release the memory. So we need to manually release it after its usage.