【问题标题】:Garbage Collection and jQuery?垃圾收集和 jQuery?
【发布时间】:2011-11-14 15:53:33
【问题描述】:

jQuery (JavaScript) 和 gc 是如何工作的?

callBack 是一个作为 JSON 响应回调函数运行的函数。

callBack 函数执行后内存中的内容是什么?

我想听到的是数据对象和autoCompleteData 将被垃圾回收。并且只有存储在$("input#reciever") 中的数据驻留在内存中。

是这样吗?

//The code in question:

var callBack = function(data) {
    var autoCompleteData = jQuery.map(data.receivers, function(receiver, i){
          return {label: receiver.name, id: receiver.id };
    });

    $("input#reciever").autocomplete({
        source: autoCompleteData,
        select: function(event, receiver) {
            $("input#reciever").val(receiver.item.label); 
            $("input#recieverId").val(receiver.item.id);
            return false;
        }

    });
}

【问题讨论】:

标签: javascript jquery garbage-collection


【解决方案1】:

Javascript 中的垃圾收集通过释放没有其他 javascript 代码引用的任何对象的内存来工作。如果没有人引用它,它就不能再被使用,因此可以安全地释放它。

对对象的引用可以来自变量或仍然处于活动状态的执行范围。

在上面的示例中,在等待 .autocomplete() 函数完成时,代码中的所有内容仍在范围内,不会被垃圾收集。这意味着 autoCompleteData 将被保留(而不是垃圾收集),直到 .autocomplete() 方法完全执行完毕。这是正常的、预期的,而且实际上是许多地方正常运行所必需的。

作为衡量此数据仍在范围内的一个原因,变量autoCompleteData 仍在select 回调函数的范围内。在select 回调函数中引用该变量是合法且适当的。因此 JS 引擎不能对它进行垃圾回收,直到它不再在范围内并且不能再被任何代码引用。

在某些情况下,您可以通过显式清除变量来使内存可用于垃圾回收。

例如,如果您像这样重组代码:

var callBack = function(data) {
    $("input#reciever").autocomplete({
        source: jQuery.map(data.receivers, function(receiver, i){
          return {label: receiver.name, id: receiver.id };,
        select: function(event, receiver) {
            $("input#reciever").val(receiver.item.label); 
            $("input#recieverId").val(receiver.item.id);
            return false;
        }

    });
}

然后,自动完成数据仅作为.autocomplete() 的参数存在,并且它可能有资格更快地进行垃圾收集,因为 JS 引擎没有要求保留该数据直到调用 select 回调之前有.数据是否真的立即被垃圾收集取决于 .autocomplete() 的内部实现是否将其存储在某个地方,直到调用 select 方法。

仅供参考,垃圾收集的确切时间对于大数据(数兆字节)、数以万计的数据(大量数据加起来高达数百兆字节)最为重要。如果测量某物的大小以千字节甚至数百千字节为单位,并且只有一个,那么内存是否立即被垃圾收集或何时调用回调的确切时间并不那么重要,因为这些天的浏览器可以访问合理数量的内存. 如果您正在处理大量数据或处理大量数据或重复执行某些操作并发生某种泄漏,那么这些都可能导致问题(尤其是在移动设备上),但是像上面这样的示例不太可能导致除非数据集相对于浏览器中的可用内存很大。

【讨论】:

    【解决方案2】:

    在 JavaScript 中对象是通过引用传递的,因此通过访问 autoCompleteData 到达的对象将与 autocomplete 插件使用的对象相同。

    因此,变量autoCompleteData 不会被垃圾回收(但这不会对您的程序有害,因为它是自动完成插件的要求。

    但是,data 对象应该被垃圾回收,因为没有提供对它的引用,并且它已超出范围。

    此外,重要的是要注意垃圾收集对于 jQuery 的工作方式并没有什么不同;它的行为与跨 JavaScript(以及 ofc,所有其他 JavaScript 框架)的行为相同。

    【讨论】:

    • 如果我理解正确,自动完成插件不会循环通过我的 autoCompleteData 并设置内部参数,而是在每次按下键时直接循环 autoCompleteData 对象。如果是这种情况,我同意只对数据对象进行垃圾收集。感谢您解释插件的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多