JavaScript匿名函数垃圾回收
如果我有这样的功能
function do(callback) {
//do stuff
callback();
}
然后我传递一个匿名函数:
do(function() { //do something else });
这个匿名函数是否在页面的生命周期中被收集? 如果没有,我如何使它可用于GC?
我必须这样做吗?
var h = function() { //do something };
do(h);
delete h;
我甚至不必担心这个吗? 我正在构建一个具有很长使用期限的Web应用程序,这使得大量的Ajax调用会将对象保留一段时间,并且不需要刷新页面来导航。 所以我想弄清楚我是否可能陷入内存泄漏怪物。
对匿名函数的唯一引用是函数参数,并且在函数完成时消失,因此您的回调将在此之后用于垃圾回收。 除了有其他的东西可以参考它,这可以通过闭包很容易地发生:
function doo(callback) {
$.get(url, function() {
// callback is visible here!
});
callback();
}
doo(function() { /* do something else */ });
callback
函数(以及通过调用doo
创建的整个范围)必须留在内存中,因为内部函数可以通过闭包来引用它; 它只能在内部函数被垃圾收集时进行垃圾回收,并且由于该函数是jqXHR对象的属性,所以在此之前必须对该对象进行垃圾回收,并且谁知道何时会发生这种情况......
更新您可以通过不在其他函数中定义函数来避免不必要的关闭:
var func = function() {
// callback is not visible here
}
function doo(callback) {
$.get(url, func);
callback();
}
doo(function() { /* do something else */ });
注意循环引用,否则浏览器的GC将清除它们。 闭包使创建循环引用变得非常简单,即使您从创建它的页面离开,它也可能会被困在内存中。 因此,长时间停留在屏幕上的Web应用程序尤其容易受到攻击。
查看“内存泄漏”一节:https://developer.mozilla.org/en/A_re-introduction_to_JavaScript。
我设计了不少静态页面的Web应用程序。 我发现,即使你没有清理的对象和事件处理程序(即你肯定没有循环引用),它不能伤害。 它通常只会添加一些额外的代码行,并且会在编写代码时将内存使用和效率保持在您头脑中的最前沿。 这对于web开发人员来说是一种转变,因为在创建网站时我们通常不需要考虑这种事情。
链接地址: http://www.djcxy.com/p/27181.html