关闭:
function test() {
var count = 0;
return function() {
count++;
};
}
Run Code Online (Sandbox Code Playgroud)
众所周知,调用count后不会释放test(),现在如果闭包对我没用,我怎么能释放它的内存呢?
javascript 中的所有对象都被垃圾收集,无论它们是否参与关闭的天气。在你上面的代码中,如果你这样做:
var x = test();
Run Code Online (Sandbox Code Playgroud)
那么当然count不能释放for 的内存,因为它以后可能会被x. 但是,如果您这样做:
var x = test();
x = "";
Run Code Online (Sandbox Code Playgroud)
的内存count迟早会被垃圾回收。
另外,如果你这样做:
function foo () {
var x = test();
x();
}
foo();
Run Code Online (Sandbox Code Playgroud)
内存count也将被垃圾收集,因为x在foo()结束时超出范围。
确保在 javascript 中没有内存泄漏的最佳方法是避免使用全局变量。
注意:旧版 IE 中的垃圾收集器使用简单的引用计数,这意味着循环数据结构不会被垃圾收集。这在 IE6 或 IE7 中已得到修复,并且在其他通常使用标记和清除垃圾收集器的 javascript 引擎中从未出现过问题