gpt4 book ai didi

javascript - JavaScript 中的垃圾回收是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 22:59:13 24 4
gpt4 key购买 nike

JavaScript 中的垃圾回收是如何工作的?它类似于 .NET 垃圾收集吗?是不是因为 VBScript 中垃圾回收的实现很糟糕,人们才避免使用它并倾向于选择 JavaScript 作为标准客户端语言?

最佳答案

How does garbage collection work?

简短的答案是:当一 block 内存(例如一个对象)不再可达时,它就可以被回收。何时、如何或是否回收完全取决于实现,并且不同的实现会采取不同的方式。但在语言层面,它是自动的。

例如:

function foo() {
var bar;

bar = new ReallyMassiveObject();
bar.someCall();
}

何时 foo返回,对象 bar指向的内容自动可用于垃圾回收,因为没有任何内容可以引用它。

对比:

function foo() {
var bar;

bar = new ReallyMassiveObject();
bar.someCall();
return bar;
}
// elsewhere
var b = foo();

...现在,对该对象的引用在调用后继续存在,并持续存在,直到/除非调用者将其他内容分配给 bb超出范围。

同时对比:

function foo() {
var bar;

bar = new ReallyMassiveObject();
bar.someCall();
setTimeout(function() {
alert("Three seconds have passed");
}, 3000);
}

在这里,即使在foo之后返回,计时器机制具有对计时器回调的引用,而计时器回调(闭包)具有对创建它的上下文的引用,该上下文又包含 bar多变的。结果,理论上,什么bar指的是当 foo 时不可立即进行垃圾回收。返回。相反,它会一直保留,直到计时器触发并释放其对回调的引用,从而使回调及其引用的上下文符合 GC 的条件。 (实际上,现代 JavaScript 引擎可以并且确实在可以的情况下优化闭包。例如,在上面,静态分析显示回调不引用 bar ,并且不包含任何 evalnew Function 。代码可能在运行时动态引用它,因此 JavaScript 引擎可以安全地将 bar 排除在函数引用的上下文之外,从而使其引用的内容符合 GC 的条件——现代引擎也这样做)。 (更多关于 this article 中的闭包。)

JavaScript 在处理清理循环引用时没有问题,顺便说一句,例如:

function foo() {
var a, b;

a = {};
b = {};
b.refa = a;
a.refb = b;
}

何时 foo返回,事实是 a指的是b反之亦然不是问题。由于没有其他内容涉及它们中的任何一个,因此它们都可以被清理。在 IE 上,如果其中一个对象是主机提供的对象(例如 DOM 元素或通过 new ActiveXObject 创建的对象)而不是 JavaScript 对象,则这是。 (例如,如果您将 JavaScript 对象引用放在 DOM 元素上,并且 JavaScript 对象引用回 DOM 元素,即使没有人引用它们中的任何一个,它们也会将彼此保留在内存中。)但这就是 IE bug问题,不是 JavaScript 的问题。

回复:

is it because the vbscript GC is bad that people reverted to javascript as their standard client side api?

JavaScript 是原始客户端 Web 脚本语言。 VBScript 后来才出现,当 Microsoft 推出浏览器时,并且仅在 Microsoft 浏览器中受支持。如果您想使用最广泛的浏览器,JavaScript 过去是、现在仍然是唯一的客户端脚本游戏。 <主观>它大约是经典 VBScript 语言的八倍。 ;-)

关于javascript - JavaScript 中的垃圾回收是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4324133/

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