gpt4 book ai didi

javascript - 释放 JavaScript 对象

转载 作者:行者123 更新时间:2023-12-03 13:12:30 25 4
gpt4 key购买 nike

我正在查看 http://www.javascriptkit.com/javatutors/oopjs.shtml 中的示例

var person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"

但是没有提到如何“释放”它以避免内存泄漏。

下面的代码会释放它吗?
person = null;
  • 如何使用“new Object() 释放 JavaScript 对象?
  • 如何释放使用“new Array(10)”分配的 JavaScript 数组?
  • 如何释放使用“var json = {“width”:480,“height”:640}”分配的 JavaScript JSON?

  • 在此先感谢您的帮助。

    最佳答案

    您不必显式地“释放”JavaScript 对象。所有标准 JavaScript 主机/环境都根据对象是否可以再访问来使用垃圾收集。 (可能有一些小众主机,例如一些用于嵌入式系统的主机,它们不会这样做;如果是这样,它们将提供自己的显式释放事物的方法。)如果无法再访问该对象,则它的内存可以是回收。
    您可以做的是确保没有任何内容引用您不再使用的内存,因为无法释放正在引用的内存。几乎所有时间,这都是自动发生的。例如:

    function foo() {
    var a = [1, 2, 3, 4, 5, 6];

    // Do something
    }
    分配给数组的内存 a指向有资格被回收一次 foo返回,因为它不再被任何东西引用( a 已经超出范围,没有任何东西对它有突出的引用)。
    相比之下:
    function foo() {
    var a = [1, 2, 3, 4, 5, 6];

    document.getElementById("foo").addEventListener("click", function() {
    alert("a.length is " + a.length);
    });
    }
    现在, a 的内存指向无法回收,因为有一个闭包(事件处理函数)对它有一个事件的引用,并且有一些东西将闭包保存在内存中(DOM 元素)。
    你可能认为只有在上面很重要,闭包清楚地使用 a ,但在这里没有关系:
    function foo() {
    var a = [1, 2, 3, 4, 5, 6];

    document.getElementById("foo").addEventListener("click", function() {
    alert("You clicked foo!");
    });
    }
    但是 , 根据规范 a即使闭包不使用它,它也会被保留,闭包仍然有对它的间接引用。 (更多内容在我的[相当老的] 博文 Closures Are Not Complicated 中。)有时 JavaScript 引擎可以优化 a离开了,尽管早期的积极努力被回滚了——至少在 V8 中——因为这样做所需的分析对性能的影响比仅仅让阵列保留在内存中所做的更大。
    如果我知道闭包不会使用该数组,我可以通过为 a 分配不同的值来确保不引用该数组。 :
    function foo() {
    var a = [1, 2, 3, 4, 5, 6];

    document.getElementById("foo").addEventListener("click", function() {
    alert("You clicked foo!");
    });

    a = undefined; // <===============
    }
    现在,虽然 a (变量)仍然存在,它不再引用数组,因此可以回收数组的内存。
    更多内容 this other answer here on StackOverflow .

    更新 : 我可能应该提到 delete ,尽管它不适用于您问题中的精确代码。
    如果你习惯了其他一些语言,你可能会认为“啊, deletenew 的对应物”,但实际上两者完全没有任何关系。 delete用于从对象中删除属性。它不适用于您的代码示例,原因很简单,您无法删除 var s。但这并不意味着它与您可能遇到的其他代码无关。
    让我们考虑一下似乎在很大程度上做同样事情的两段代码:
    var a = {};         // {} is the same as new Object()
    a.prop = "foo"; // Now `a` has a property called `prop`, with the value "foo"
    a.prop = undefined; // Now `a` has a property called `prop`, with the value `undefined`
    对比
    var b = {};         // Another blank object
    b.prop = "foo"; // Now `b` has a property called `prop`, with the value "foo"
    delete b.prop; // Now `b` has *NO* property called `prop`, at all
    这两者都使 prop的内存指向有资格进行垃圾收集,但有区别:在第一个示例中,我们没有删除该属性,但我们已将其值设置为 undefined .在第二个示例中,我们从对象中完全删除了该属性。这不是没有区别的区别:
    alert("prop" in a); // "true"
    alert("prop" in b); // "false"
    但这适用于您的问题,因为删除属性意味着该属性指向的任何内存都可用于回收。
    那么为什么不 delete适用于您的代码?因为您的 person是:
    var person;
    var 声明的变量是对象的属性,但不能是 delete d。 (“它们是对象的属性?”我听到你说。是的。如果你有一个 var 在全局范围内,它将成为全局对象的属性 [ window ,在浏览器中]。如果你有一个 var 在函数范围内,它成为一个不可见但非常真实的对象的属性,称为“变量对象”,用于对该函数的调用。不过,无论哪种方式,您都不能删除它们。更多关于 the link above 中关于闭包的内容。)

    关于javascript - 释放 JavaScript 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4523172/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com